Cosa succede se serializziamo e deserializziamo due oggetti che si richiamano l'un l'altro?

15

Per rendere più chiaro, questo è un esempio veloce:

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;

Quindi cosa succede se serializziamo gli oggetti a e b in un file e deserializziamo da quel file?

Ho pensato di ottenere 4 oggetti, 2 di ciascuno. Oggetti identici ma diverse istanze.

Ma non sono sicuro se c'è qualcos'altro o è giusto o sbagliato.

Se hai bisogno di una tecnologia per rispondere, per favore pensa in base a Java.

Grazie.

    
posta Seregwethrin 31.05.2012 - 21:54
fonte

2 risposte

25

Java tiene traccia degli oggetti che sono stati scritti nello stream e le istanze successive sono scritte come un ID, non un vero oggetto serializzato.

Quindi, per il tuo esempio, se scrivi istanza "a" nello stream, il flusso assegna a quell'oggetto un ID univoco (diciamo "1"). Come parte della serializzazione di "a", devi serializzare "b", e lo stream gli dà un altro id ("2"). Se poi scrivi "b" nello stream, l'unica cosa che viene scritta è l'ID, non l'oggetto reale.

Il flusso di input fa la stessa cosa al contrario: per ogni oggetto che legge dallo stream, assegna un numero ID utilizzando lo stesso algoritmo del flusso di output e quel numero ID fa riferimento all'istanza dell'oggetto in una mappa. Quando vede un oggetto che è stato serializzato usando un ID, recupera l'istanza originale dalla mappa.

Questo è il modo in cui documenti API lo descrivono:

Multiple references to a single object are encoded using a reference sharing mechanism so that graphs of objects can be restored to the same shape as when the original was written

Questo comportamento può causare problemi: poiché lo stream contiene un riferimento rigido a ciascun oggetto (in modo che sappia quando sostituire l'ID), è possibile esaurire la memoria se si scrivono molti oggetti temporanei allo stream. Lo risolvi chiamando reset() .

    
risposta data 31.05.2012 - 22:11
fonte
2

In Java questo viene risolto memorizzando nella cache gli oggetti serializzati e scrivendone il manico quando viene scritto di nuovo.

Vedi il passaggio 5 in link .

    
risposta data 31.05.2012 - 22:17
fonte

Leggi altre domande sui tag