¿Qué sucede si serializamos y deserializamos dos objetos que se refieren entre sí?

15

Para que quede más claro, este es un ejemplo rápido:

class A implements Serializable { public B b; }
class B implements Serializable { public A a; }
A a = new A();
B b = new B();
a.b = b;
b.a = a;

Entonces, ¿qué sucede si serializamos objetos ayb en un archivo y deserializamos de ese archivo?

Pensé que obtendríamos 4 objetos, 2 de cada uno. Objetos idénticos pero diferentes instancias.

Pero no estoy seguro de si hay algo más o si está bien o mal.

Si necesita responder alguna tecnología, piense en base a Java.

Gracias.

Seregwethrin
fuente

Respuestas:

25

Java realiza un seguimiento de los objetos que se han escrito en la secuencia, y las instancias posteriores se escriben como una ID, no como un objeto serializado real.

Entonces, para su ejemplo, si escribe la instancia "a" en la secuencia, la secuencia le da a ese objeto un ID único (digamos "1"). Como parte de la serialización de "a", debe serializar "b", y la secuencia le da otra identificación ("2"). Si luego escribe "b" en la secuencia, lo único que se escribe es la ID, no el objeto real.

La secuencia de entrada hace lo mismo a la inversa: para cada objeto que lee de la secuencia, asigna un número de ID utilizando el mismo algoritmo que la secuencia de salida, y ese número de ID hace referencia a la instancia del objeto en un mapa. Cuando ve un objeto que se serializó con una ID, recupera la instancia original del mapa.

Así es como lo describen los documentos de la API :

Se codifican múltiples referencias a un solo objeto utilizando un mecanismo de intercambio de referencias para que los gráficos de los objetos se puedan restaurar a la misma forma que cuando se escribió el original

Este comportamiento puede causar problemas: debido a que el flujo contiene una referencia fuerte a cada objeto (para que sepa cuándo sustituir la ID), puede quedarse sin memoria si escribe muchos objetos transitorios en el flujo. Lo resuelves llamando reset().

parsifal
fuente
Entonces hará que regrese al estado original después de la deserialización, ¿verdad? Como es antes de la serialización con referencias entre sí?
Seregwethrin
1
Sí, terminas con solo 2 objetos, haciendo referencia entre sí.
hectorct
1
No puedo creer que Java maneje esto automáticamente. Estoy impresionado
Cruncher