在Java方法中序列化/反序列化子类对象

在Java方法中序列化/反序列化子类对象,java,serialization,Java,Serialization,我希望在我的类中有一个保存/加载函数。我创建了一个私有子类,在其中存储我要保存的所有数据 public class MyClass { private class Progress implements Serializable { private static final long serialVersionUID = 1L; boolean val1 = true; int val2 = 0; ArrayLis

我希望在我的类中有一个保存/加载函数。我创建了一个私有子类,在其中存储我要保存的所有数据

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();
        }
    }

}
公共类MyClass{
私有类进度实现可序列化{
私有静态最终长serialVersionUID=1L;
布尔值1=真;
int val2=0;
ArrayList=新建ArrayList();
}
私有进度=新进度();
公共工程进度(){
进度=空;
尝试
{
FileInputStream fileIn=newfileinputstream(“./tmp/progress.ser”);
ObjectInputStream in=新的ObjectInputStream(fileIn);
progress=.readObject()中的(progress);
in.close();
fileIn.close();
}捕获(IOI异常)
{
i、 printStackTrace();
返回;
}捕获(ClassNotFoundException c)
{
System.out.println(“未找到进度类”);
c、 printStackTrace();
返回;
}
}
公共存储进度(){
尝试
{
文件f=新文件(“./tmp/progress.ser”);
f、 getParentFile().mkdirs();
FileOutputStream outputstream=新的FileOutputStream(f);
ObjectOutputStream out=新的ObjectOutputStream(outputstream);
out.writeObject(进度);
out.close();
outputstream.close();
}捕获(IOI异常){
i、 printStackTrace();
}
}
}

但是,当我想尝试这段代码时,它在saveProgress()方法中给了我java.io.NotSerializableException异常,因此,loadProgress()方法也不起作用。如何序列化这个类

外部类还需要是可序列化的,因为每个内部类都有一个对外部类的隐式引用


因此,要解决这个问题,您需要将
MyClass
标记为
Serializable
或使
Progress
成为一个静态类。静态类没有对外部类的引用。

外部类也需要是可序列化的,因为每个内部类都有对外部类的隐式引用


因此,要解决这个问题,您需要将
MyClass
标记为
Serializable
或使
Progress
成为一个静态类。静态类没有对外部类的引用。

当您尝试序列化内部类的实例时,外部实例也将被序列化。在您的情况下,
MyClass
是不可序列化的,因此无法工作。有两种可能的解决办法:

  • 使
    Progress
    成为静态嵌套类
  • 使
    MyClass
    可序列化

只要可能,我都会支持第一种方法,因为它序列化的数据更少,因此具有更好的性能和空间效率。

当您尝试序列化内部类的实例时,外部实例也会被序列化。在您的情况下,
MyClass
是不可序列化的,因此无法工作。有两种可能的解决办法:

  • 使
    Progress
    成为静态嵌套类
  • 使
    MyClass
    可序列化
只要可能,我都会支持第一种方法,因为它序列化的数据更少,因此具有更好的性能和空间效率