java serialization inner-classes

java - ¿Por qué una clase interna serializable no es serializable?



serialization inner-classes (3)

¿Qué pasa si InnerClass necesita este acceso?

Entonces necesita la instancia de la clase externa, y debe ser serializada junto con la clase interna.

¿Hay una manera de serializar una clase interna no estática sin la clase envolvente, por ejemplo, haciendo transitoria la referencia a la clase externa?

No. ¿Qué pasaría cuando deserialice tal clase y luego intente llamar a un método de instancia de la clase externa? Una NullPointerException ?

El siguiente código:

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; } }

lanza la siguiente excepción:

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

Supongo que la clase interna tiene un campo TestInnerClass.this que le permite acceso privado a los campos y métodos de TestInnerClass . Declarar la clase interna estática lo resuelve , pero ¿qué InnerClass si InnerClass necesita este acceso? ¿Hay una manera de serializar una clase interna no estática sin la clase envolvente, por ejemplo, haciendo transient la referencia a la clase externa?

edición: por ejemplo, el acceso a la clase externa solo podría ser necesario antes de la serialización. OK, el compilador no puede saberlo, pero pensé que esa es la razón por la cual existe la palabra clave transient .


¿Qué tal si TestInnerClass es serializable?

public class TestInnerClass implements Serializable { }


InnerClass no puede ser serializado porque para crear una instancia (como se requiere durante la deserialización) necesita una referencia a una instancia de la clase externa

Las instancias de clases internas no pueden existir sin una instancia de la clase externa.

es decir

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

Si utiliza una clase interna estática, será posible serializar la clase interna estática. Las instancias de clases internas estáticas se pueden crear de forma independiente.

es decir

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