La serializzazione è necessaria ogni volta che un oggetto deve essere persistito o trasmesso oltre l'ambito della sua esistenza.
La persistenza è la possibilità di salvare un oggetto da qualche parte e caricarlo in un secondo momento con lo stesso stato. Ad esempio:
- Potrebbe essere necessario memorizzare un'istanza di oggetto su disco come parte di un file.
- Potrebbe essere necessario memorizzare un oggetto in un database come un blob (oggetto binario di grandi dimensioni).
La trasmissione è la capacità di inviare un oggetto al di fuori del suo ambito originale ad un ricevitore. Ad esempio:
- Potrebbe essere necessario trasmettere un'istanza di un oggetto a una macchina remota.
- Potrebbe essere necessario trasmettere un'istanza a un altro AppDomain o elaborare sullo stesso computer.
Per ognuno di questi, deve essere presente una rappresentazione di bit seriale che può essere memorizzata, comunicata e successivamente utilizzata per ricostituire l'oggetto originale. Il processo di trasformare un oggetto in questa serie di bit è chiamato "serializzazione", mentre il processo di trasformare la serie di bit nell'oggetto originale è chiamato "deserializzazione".
La rappresentazione reale dell'oggetto in forma serializzata può variare a seconda di quali sono i tuoi obiettivi. Ad esempio, in C#, si ha sia la serializzazione XML (tramite la classe XmlSerializer
) che la serializzazione binaria (tramite l'uso della classe BinaryFormatter
). A seconda delle esigenze, è anche possibile scrivere il proprio serializzatore personalizzato per eseguire operazioni aggiuntive come compressione o crittografia. Se hai bisogno di un formato di serializzazione in lingua e piattaforma neutra, puoi provare con Google Protocol Buffers che ora ha support for .NET (non l'ho usato).
La rappresentazione XML sopra menzionata è utile per archiviare un oggetto in un formato standard, ma può essere prolisso e lento a seconda delle esigenze. La rappresentazione binaria consente di risparmiare spazio ma non è così portabile tra lingue e runtime come XML. Il punto importante è che il serializzatore e il deserializzatore devono capirsi a vicenda. Questo può essere un problema quando inizi a introdurre compatibilità con versioni precedenti e precedenti e versioni.
Un esempio di potenziali problemi di compatibilità serializzazione:
- si rilascia la versione 1.0 del programma che è in grado di serializzare alcuni
Foo
oggetto in un file.
- L'utente esegue qualche azione per salvare il suo
Foo
in un file.
- Si rilascia la versione 2.0 del programma con un
Foo
aggiornato.
- L'utente tenta di aprire il file versione 1.0 con il programma versione 2.0.
Questo può essere un problema se la versione 2.0 Foo
ha proprietà aggiuntive che la versione 1.0 Foo
non ha fatto. Devi esplicitamente non supportare questo scenario o avere qualche storia di versionamento con la tua serializzazione. .NET può fare qualcosa per te. In questo caso, potresti anche avere il problema inverso: l'utente potrebbe provare ad aprire un file versione 2.0 con la versione 1.0 del tuo programma.
Non ho usato queste tecniche me stesso, ma .NET 2.0 e versioni successive ha il supporto per version tolerant serialization per supportare sia la compatibilità in avanti e indietro:
- Tolleranza dei dati estranei o imprevisti. Ciò consente alle versioni più recenti del tipo di inviare dati a versioni precedenti.
- Tolleranza di dati opzionali mancanti. Ciò consente alle versioni precedenti di inviare dati a versioni più recenti.
- Callback di serializzazione. Ciò consente l'impostazione intelligente del valore predefinito nei casi in cui mancano i dati.
fonte
2010-10-21 05:15:00
puoi darmi uno scenario o un esempio, dove l'oggetto deve essere persistito oltre la portata della sua esistenza? – FosterZ
oh nice, thanku – FosterZ
grazie per le informazioni sull'addotto 'Protocollo di Google Buffer' e' serializzazione tollerante della versione'. – FosterZ