Why is a serializable inner class not serializable?
以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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; } } |
引发以下异常:
1 |
号
我猜内部类有一个
编辑:例如,只能在序列化之前访问外部类。好吧,编译器不知道这一点,但我认为这就是
what if InnerClass needs this access?
号
然后它需要外部类实例,并且必须与内部类一起序列化。
Is there a way to serialize a non-static inner class without the enclosing class, e.g. by making the reference to the outer class transient?
号
不。当反序列化此类类,然后尝试调用外部类的实例方法时,会发生什么?一个
无法序列化InnerClass,因为要实例化它(在反序列化过程中需要),需要引用外部类的实例
没有外部类的实例,内部类的实例不能存在。
即
1 2 | OuterClass o = new OuterClass(); OuterClass.InnerClass o_i = o.new InnerClass(); |
号
如果使用静态内部类,则可以序列化静态内部类。静态内部类的实例可以独立创建。
即
1 2 | OuterClass o = new OuterClass(); OuterClass.InnerClass i = new OuterClass.InnerClass(); |
如何使testinerClass可序列化?
1 |