¿Qué sucede si serializamos y deserializamos dos objetos que se hacen referencia 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 los objetos ayb en un archivo y deserializamos de ese archivo?

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

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

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

Gracias.

    
pregunta Seregwethrin 31.05.2012 - 21:54
fuente

2 respuestas

25

Java realiza un seguimiento de los objetos que se han escrito en el flujo, y las instancias posteriores se escriben como una identificación, no un objeto serializado real.

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

El flujo de entrada hace lo mismo a la inversa: para cada objeto que lee del flujo, asigna un número de ID usando el mismo algoritmo que el flujo de salida, y ese número de ID hace referencia a la instancia del objeto en un mapa. Cuando ve un objeto que fue serializado usando una identificación, recupera la instancia original del mapa.

Así es como documentos API :

  

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

Este comportamiento puede causar problemas: debido a que la secuencia contiene una referencia difícil a cada objeto (para que sepa cuándo sustituir la ID), puede quedarse sin memoria si escribe muchos objetos transitorios en la secuencia. Resuelves eso llamando a reset() .

    
respondido por el parsifal 31.05.2012 - 22:11
fuente
2

En Java, esto se resuelve almacenando en caché los objetos serializados y escribiendo el controlador cuando se escribe de nuevo.

Consulte el paso 5 en enlace .

    
respondido por el ratchet freak 31.05.2012 - 22:17
fuente

Lea otras preguntas en las etiquetas