2016-07-24 31 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(); 
     } 
    } 

} 

但當我想試試這個代碼,它給了我java.io.NotSerializableException例外,在saveProgress()方法,也正因爲如此,在loadProgress()方法是不是工作壓力太大。我如何序列化這個類?

回答

1

當您嘗試序列化內部類的實例時,外部實例也將被序列化。在你的情況下,MyClass是不可序列化的,所以它不會工作。有兩種可能的解決方法:

  • 使Progress靜態嵌套類
  • 使MyClass序列化

我會贊成第一種方法的爭論,只要有可能,因爲它系列化較少的數據,因此具有更好的性能和空間效率。

1

外部類也需要是Serializable,因爲每個內部類都具有對外部類的隱式引用。

所以要解決此問題,您需要將MyClass標記爲Serializable或使Progress成爲靜態類。靜態類不具有對外部類的引用。

相關問題