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.
Sono i campi stessi o il valore assegnato? –
È il campo o il valore assegnato a quello o entrambi? –
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 –