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

以下代码:

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:

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

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

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

如果InnerClass需要这种访问怎么办?

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

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

不。当您反序列化这样的类然后尝试调用外部类的实例方法时会发生什么? NullPointerException

如何使TestInnerClass可序列化?

 public class TestInnerClass implements Serializable { } 

InnerClass无法序列化,因为要实例化它(在反序列化期间需要),您需要引用外部类的实例

没有外部类的实例,内部类的实例不可能存在。

 OuterClass o = new OuterClass(); OuterClass.InnerClass o_i = o.new InnerClass(); 

如果使用静态内部类,则可以序列化静态内部类。 静态内部类的实例可以独立创建。

 OuterClass o = new OuterClass(); OuterClass.InnerClass i = new OuterClass.InnerClass();