我想在班上保存/加载功能。我创建了一个私有子类,我存储了我想要保存的每个数据。
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()方法也不起作用。我如何序列化这个类?
答案 0 :(得分:1)
外类也需要Serializable
,因为每个内部类都有一个对外部类的隐式引用。
因此,要解决此问题,您需要将MyClass
标记为Serializable
或将Progress
标记为静态类。静态类没有引用外部类。
答案 1 :(得分:1)
当您尝试序列化内部类的实例时,外部实例也将被序列化。在您的情况下,MyClass
不可序列化,因此无法正常工作。有两种可能的解决方法:
Progress
成为静态嵌套类MyClass
serializable 我会支持第一种方法,因为它可以序列化较少的数据,因此具有更好的性能和空间效率。