2009-11-24 18 views
14

Ad esempio: l'oggetto A contiene l'oggetto B che contiene l'oggetto C che contiene l'oggetto A.La serializzazione Java funziona con riferimenti ciclici?

L'oggetto A serializza correttamente?

Il commento n. 9 here indica che non funziona.

Al contrario, XStream indica che gestisce i riferimenti ciclici.

+0

Il modo in cui ho capito commento # 9, sta parlando della difficoltà di attuazione serializzabilità a mano, non si tratta di difetti di attuazione ufficiale. – meriton

+0

Sì, rileggo che penso di essere d'accordo che implica a mano. – Brandon

+0

Cosa succede quando ** PROVA **? –

risposta

14

Sì, la serializzazione Java predefinita funziona per i riferimenti ciclici. Quando serializzi l'oggetto C, il campo conterrà un riferimento all'oggetto A già serializzato anziché serializzarlo di nuovo.

+2

C'è qualche documentazione su come funziona ... Mi piacerebbe gestirlo in una delle mie implementazioni di serializzazione. –

3

Sì, la serializzazione Java funziona con riferimenti circolari, leggere here per ulteriori informazioni per comprendere meglio cosa può fare la serializzazione Java.

+1

Grazie dal collegamento "Casi particolari come riferimenti circolari e riferimenti multipli a un singolo oggetto sono conservati in modo tale che quando il grafico ad albero viene ricreato, nuovi oggetti non appaiono magicamente dove dovrebbe essere un riferimento ad un altro oggetto nell'albero." http://java.sun.com/developer/technicalArticles/ALT/serialization/ – Brandon

0

È possibile visualizzare la referenziazione in prima persona se si serializza l'oggetto in XML. Gli oggetti figli sono serializzati una sola volta. Qualsiasi riferimento (in qualsiasi punto della struttura serializzata) a un oggetto figlio che è già stato serializzato punta semplicemente a quell'oggetto nel file.

La serializzazione dei riferimenti ciclici può essere un po 'complicata, quindi è consigliabile evitarli, se possibile.

1

Sì, sì.

Ho fatto questo test molto, molto semplice, e almeno ha completato la serializzazione. Suppongo sia corretto, ma puoi verificarlo con alcune linee extra.

import java.io.*; 
class A implements Serializable { B b; } 
class B implements Serializable { C c; } 
class C implements Serializable { A a; } 
class Test { 
    public static void main(String [] args) throws IOException { 
     A a = new A(); 
     a.b = new B(); 
     a.b.c = new C(); 
     a.b.c.a = a; 
     new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(a); 
     System.out.println("It works"); 

    }  
} 
Problemi correlati