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

时间:2016-07-24 18:28:32

标签: java serialization

我想在班上保存/加载功能。我创建了一个私有子类,我存储了我想要保存的每个数据。

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()方法也不起作用。我如何序列化这个类?

2 个答案:

答案 0 :(得分:1)

外类也需要Serializable,因为每个内部类都有一个对外部类的隐式引用。

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

答案 1 :(得分:1)

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

  • 使Progress成为静态嵌套类
  • make MyClass serializable

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