2016-07-24 2 views
0

私のクラスにセーブ/ロード機能が必要です。私は私が保存したいすべてのデータを保存するプライベートサブクラスを作成しました。Javaのメソッドでサブクラスオブジェクトをシリアライズ/逆シリアル化する

public class MyClass { 

    private class Progress implements Serializable { 
     private static final long serialVersionUID = 1L;  
     boolean val1 = true; 
     int val2 = 0; 
     ArrayList<String> list = new ArrayList<String>(); 
    } 

    private Progress progress = new Progress();  

    public void loadProgress() { 
     progress = null; 
     try 
     { 
      FileInputStream fileIn = new FileInputStream("./tmp/progress.ser"); 
      ObjectInputStream in = new ObjectInputStream(fileIn); 
      progress = (Progress) in.readObject(); 
      in.close(); 
      fileIn.close(); 
     }catch(IOException i) 
     { 
      i.printStackTrace(); 
      return; 
     }catch(ClassNotFoundException c) 
     { 
      System.out.println("Progress class not found"); 
      c.printStackTrace(); 
      return; 
     } 
    } 

    public void saveProgress() { 
     try 
     { 
      File f = new File("./tmp/progress.ser"); 
      f.getParentFile().mkdirs(); 
      FileOutputStream outputstream = new FileOutputStream(f); 
      ObjectOutputStream out = new ObjectOutputStream(outputstream); 
      out.writeObject(progress); 
      out.close(); 
      outputstream.close(); 
     }catch(IOException i) { 
      i.printStackTrace(); 
     } 
    } 

} 

しかし、私はこのコードを試してみたいとき、それはsaveProgress()メソッドでくれjava.io.NotSerializableException例外を与え、このために、loadProgress()メソッドは、あまりにも動作しません。どのように私はこのクラスをシリアル化できますか?

答えて

1

内部クラスのインスタンスをシリアル化しようとすると、外部インスタンスもシリアル化されます。あなたのケースでは、MyClassはシリアライズ可能ではありませんので、動作しません。 2つの回避策があります

  • Progress静的な入れ子になったクラスを作る
  • が作るMyClass、シリアライズ
それがゆえ持っているより少ないデータをシリアライズして以来、それが可能だ時はいつでも、私は最初のアプローチを支持して主張したい

パフォーマンスとスペース効率が向上します。

1

外部クラスもそれぞれSerializableである必要があります。これは、各内部クラスに外部クラスへの暗黙の参照があるためです。

これを解決するには、MyClassSerializableとマークするか、Progressを静的クラスにする必要があります。静的クラスは外部クラスへの参照を持ちません。

関連する問題