关于java:为什么可序列化的内部类不可序列化?

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
Exception in thread"main" java.io.NotSerializableException: TestInnerClass

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

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


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?

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


无法序列化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
public class TestInnerClass implements Serializable { }