Why is a serializable inner class not serializable?

tb189 picture tb189 · Aug 22, 2011 · Viewed 29.5k times · Source

The following code:

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;

    }

}

throws the following exception:

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

I guess the inner class has a TestInnerClass.this field that allows it private access to TestInnerClass's fields and methods. Declaring the inner class static solves it, but 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?

edit: for example, access to the outer class could be needed only before serialization. OK, the compiler cannot know that, but I thought that's why the transient keyword exists.

Answer

Michael Borgwardt picture Michael Borgwardt · Aug 22, 2011

what if InnerClass needs this access?

Then it needs the outer class instance, and it must be serialized along with the inner class.

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?

No. What would happen when you deserialize such a class and then try to call an instance method of the outer class? A NullPointerException?