为什么可序列化的内部类不可序列化?

2022-09-01 15:50:39

下面的代码:

public class TestInnerClass {

    public static void main(String[] args) throws IOException {
        new TestInnerClass().serializeInnerClass();
    }

    private void serializeInnerClass() throws IOException {
        File file = new File("test");
        InnerClass inner = new InnerClass();
        new ObjectOutputStream(new FileOutputStream(file)).writeObject(inner);
    }

    private class InnerClass implements Serializable {

        private static final long serialVersionUID = 1L;

    }

}

引发以下异常:

Exception in thread "main" java.io.NotSerializableException: TestInnerClass

我猜内部类有一个字段,允许它私有访问 的字段和方法。声明内部类 static 可以解决它,但是如果需要此访问权限呢?有没有办法在没有封闭类的情况下序列化非静态内部类,例如通过引用外部类?TestInnerClass.thisTestInnerClassInnerClasstransient

edit:例如,在序列化之前可能只需要访问外部类。好吧,编译器不能知道,但我认为这就是关键字存在的原因。transient


答案 1

如果 InnerClass 需要此访问权限,该怎么办?

然后,它需要外部类实例,并且必须与内部类一起序列化。

有没有办法在没有封闭类的情况下序列化非静态内部类,例如,通过使对外部类的引用瞬态化?

不。当您反序列化此类,然后尝试调用外部类的实例方法时,会发生什么情况?一个?NullPointerException


答案 2

如何使TestInnerClass可序列化?

public class TestInnerClass implements Serializable { }