2009-05-30 16 views
6

In serializzazione (serializzazione binaria) quali dati vengono trasferiti? Un'istanza di una classe (oggetto) o valori assegnati alle proprietà di quell'oggetto.Quali dati vengono passati in serializzazione? (Serializzazione binaria)

Voglio sapere cosa succede nel processo di serializzazione in pratica? Voglio dire, un oggetto viene convertito nel suo file di destinazione o in qualsiasi altra cosa nella serializzazione. Ma come? Quali passi vengono seguiti in questo processo?

Qualcuno può aiutare?

Jay ...

risposta

1

Per impostazione predefinita, solo i campi di un tipo vengono serializzati quando si utilizza la serializzazione binaria. Le proprietà sono trattate come metodi e non hanno alcun effetto sulla serializzazione.

Quando si utilizza la serializzazione Xml, le proprietà pubbliche sono serializzate per impostazione predefinita.

+0

Sono i campi stessi o il valore assegnato? –

+0

È il campo o il valore assegnato a quello o entrambi? –

+0

Per serializzazione xml, campi pubblici + proprietà con accesso sia in lettura * che in scrittura; che non sono contrassegnati [XmlIgnore]; o 'IXmlSerializable' ha i primi dib ;-p –

4

Suppongo vogliate dire BinaryFormatter; dipende ;-p

Lo scopo di serializzazione è di esprimere un complesso oggetto in memoria come una semplice sequenza di byte (oa seconda del serializzatore - caratteri, ecc) che possono essere reidratati all'altra estremità di ricreare l'oggetto.

Alcuni tipi (primitivi, stringhe, ecc.) Hanno un supporto diretto integrato dal serializzatore - li scrive direttamente.

Nel caso di classi, i metadati di tipo (incuding assemblaggio nome, ecc) è scritto, allora tutti i campi sul tipo sono enumerato (in sostanza, Type.GetFields(), compreso ecc privato). Per ogni campo (non contrassegnato con [NonSerialized]), il nome del campo viene scritto e il valore viene serializzato (tramite lo stesso processo). Alla fine, tutto si riduce alle primitive in-built, alcune definizioni di tipo e alcune coppie di campi nome/valore.

Un'eccezione è qui se il tipo implementa ISerializable - nel qual caso viene richiesto al tipo di serializzarsi sull'output. Questo è comune in cose come i tipi di dizionario, in cui il layout in memoria del tipo può essere espresso in modo diverso da un flusso.

Durante la deserializzazione il processo è invertito; i metadati di tipo vengono utilizzati per creare un oggetto vuoto (a meno che non abbia un costruttore di serializzazione speciale/ISerializable); quindi i campi vengono impostati così come vengono trovati nello stream.

Sia in serializzazione che in deserializzazione ci sono punti di "callback" in cui è possibile eseguire codice aggiuntivo per correggere gli oggetti per la (de) serializzazione.

Questo processo è fragile; per molti motivi, see here - ma è anche intollerante alla versione e specifica dell'implementazione (non è possibile consumarlo da java, ecc.).

protobuf-net risolve molti di questi problemi, essendo un serializzatore binario che è contratto-base, piuttosto che campo-base.


+1

E per quanto riguarda le proprietà automatiche, i loro campi di supporto sono serializzati? Oh e visto che hai citato protobuf-net, ecco il link: http://code.google.com/p/protobuf-net/ – M4N

+1

re proprietà automatiche: si lo sono; ma questo è * specialmente * fragile vedere il link "vedi qui" per il perché. Modificherò per inserire il link protobuf-net, ma abbastanza curiosamente lo so già abbastanza bene :-p –

+0

Grazie. A proposito: sapevo che TU conoscevi il link, l'ho aggiunto per altri lettori :) – M4N

5

La serializzazione binaria sta eseguendo lo snapshot dell'oggetto e lo serializza. Significa che tutti i campi privati, che non sono contrassegnati come Non serializzabili, saranno serializzati con i loro valori. Tutti gli oggetti utilizzati nella gerarchia degli oggetti devono essere resi serializzabili. Si dovrebbe mettere [field: NonSerializable] attributo su eventi, in modo da gestori di eventi non ottenere serializzato troppo: http://bytes.com/groups/net-c/250944-nonserialized-attribute-events#post1013968

Tenete a mente che quando la deserializzazione oggetto, si deve avere esattamente lo stesso oggetto in stesso assembly, come quando si serializzato (stesso significato stesso informazioni di assemblaggio). In caso contrario, è possibile utilizzare la classe SerializationBinder in modo da poter ripristinare il tipo in cui il flusso verrà sterilizzato.

+1

Sì! Questo attributo [field: NonSerializable] è molto buono da sapere. Il codice ti dà solo un'eccezione di serializzazione spuria quando non usi l'attributo sugli eventi, lasciandoti completamente all'oscuro sul motivo per cui l'eccezione è stata lanciata. – Dabblernl

+0

Pedante: [campo: Non serializzabile] si applica solo a "eventi di tipo campo"; per altre implementazioni di eventi (campo esplicito, EventHandlerList, ecc.) contrassegni direttamente il campo. –

+0

typo: sterlized? –