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()
.
En Java, esto se resuelve almacenando en caché los objetos serializados y escribiendo el identificador cuando se vuelve a escribir.
Vea el paso 5 en http://docs.oracle.com/javase/6/docs/platform/serialization/spec/output.html .
fuente