java为什么可序列化的内部类不可序列化?
以下代码:
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
我猜内部类有一个TestInnerClass.this
字段,允许它对TestInnerClass
的字段和方法进行私有访问。声明内部类static solves it,但是如果InnerClass
需要这个访问呢?有没有一种方法可以在不使用封闭类的情况下序列化非静态的内部类,例如通过引用外部类transient
编辑:例如,只有在序列化之前才需要访问外部类。好的,编译器不能知道这一点,但我认为这就是transient
关键字存在的原因
# 1 楼答案
让TestInnerClass可序列化怎么样
# 2 楼答案
内部类无法序列化,因为要实例化它(在反序列化过程中需要),需要引用外部类的实例
没有外部类的实例,内部类的实例就不能存在
即
如果使用静态内部类,则可以序列化静态内部类。静态内部类的实例可以独立创建
即
# 3 楼答案
然后它需要外部类实例,并且必须与内部类一起序列化
不会。当您反序列化这样一个类,然后尝试调用外部类的实例方法时会发生什么?A
NullPointerException