2012-09-16 17 views
6

Diciamo che ho una matrice arr di oggetti di tipo A in memoria, ognuno dei quali ha un campo di riferimento che punta allo stesso oggetto B.Serializzazione Java, Kryo e il grafico dell'oggetto

Illustrazione:

A_1 A_2 A_3 ... A_N 
| | |  | 
| | V  | 
\--->\--> B <-----/ 

Notare che il campo di riferimento in ogni oggetto di tipo A punti allo stesso oggetto di tipo B.

Ora serializzo l'array arr contenente oggetti di tipo A in un ObjectOutputStream. Poi ho deserializzato i byte ottenuti in questo modo.

Ricevo un nuovo array arr1.

1) Se la matrice arr1 hanno oggetti di tipo A tale che tutti indicano lo stesso oggetto di tipo B? (Non intendo lo stesso oggetto prima della serializzazione, ma un oggetto unico di nuova creazione di tipo B)

2) In altre parole, la chiamata serialize/deserialize in Java conserva lo stesso grafico oggetto che era prima della serializzazione? (cioè il grafo oggetto deserializzato è isomorfo a quello vecchio)

3) Dove è documentato? (per favore, fornire una citazione)

4) Le stesse domande 1-3, ma applicate al framework di serializzazione Kryo per Java.

Grazie.

risposta

9

http://docs.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html

Il meccanismo di serializzazione di default per un oggetto scrive la classe del dell'oggetto, la firma di classe, ed i valori di tutti i campi non transienti e non statici. I riferimenti ad altri oggetti (eccetto nei campi transitori o statici ) causano anche la scrittura di quegli oggetti. Più riferimenti a un singolo oggetto vengono codificati utilizzando un meccanismo di condivisione di riferimento in modo che i grafici degli oggetti possano essere ripristinati nella stessa forma di quando veniva scritto l'originale.

Per quanto riguarda la mia comprensione della specifica, si ottiene condiviso riferimenti agli oggetti, se le istanze di oggetti da andare throught la stessa ObjectOutputStream condivisi.

Quindi, quando serializzi la classe contenente l'array arr, ogni oggetto scritto ottiene un ID e per ogni riferimento che passa attraverso il flusso, viene scritto solo quell'ID. Il grafico deserializzato in quel caso rimane omogeneo con il grafico originale.

Mi dispiace ma non posso aiutare con il meccanismo di serializzazione della libreria di Krio, sarei molto felice di imparare da qualcuno che lo ha usato.

EDIT merito Kryo:

Alcuni documentazione ho trovato:

  • Per default, ogni aspetto di un oggetto nel grafico dopo il primo viene memorizzato come un numero ordinale intero. Ciò consente di serializzare più riferimenti allo stesso oggetto e grafici ciclici. Questo ha una piccola quantità di overhead e può essere disattivata per risparmiare spazio, se non è necessario: kryo.setReferences(false);

  • This (GitHub) è il contratto del resolver di riferimento; due attuazione sono indicati: ArrayList-based per piccoli oggetti grafici, basato su mappe per le grandi

  • This è la realizzazione di matrice oggetto predefinito (de) serializzatore

  • classi devono essere registrato per (de) serializzazione; ogni classe registrato può essere accoppiato con un serializzatore (tra cui, il default Java serializzazione mechanism)

+0

Attraverso lo stesso 'ObjectOutputStream', o in aggiunta, attraverso la stessa invocazione del metodo' writeObject'? – axel22

+2

Solo attraverso lo stesso flusso; pensa a due oggetti che si riferiscono l'un l'altro. Scrivi il primo (e quindi il riferimento al secondo) al flusso. Quando si scrive il secondo nello stesso flusso, che ha ID per entrambi, i riferimenti vengono condivisi. –

+0

Grazie per l'ottima risposta! – axel22