Serializzazione di classi contenenti generici con compatibilità con le versioni precedenti
-
09-09-2019 - |
Domanda
Sto cercando di scoprire il modo migliore per gestire la serializzazione nel mio programma.
Voglio serializzare i campi privati (quindi il serializzatore XML non è opzione) voglio serializzare tipi generici come bindinglist (Soapserializer non è opzione) Voglio anche fornire un certo livello di supporto per poter deserializzare gli oggetti dalle versioni precedenti del mio programma.
Quindi tutto ciò che penso mi rimanga è BinarySerializer e l'implementazione dell'interfaccia ISerializable per far fronte alla compatibilità futura.
È corretto?
Nota:Devo dire che ho trovato questo progetto.Tuttavia il progetto sembrava morto e non riuscivo a farlo funzionare (errore file mancante)http://sourceforge.net/project/showfiles.php?group_id=196509
Soluzione
Con BinaryFormatter
, Puoi usare [OptionalField]
, ma questo è ancora molto fragile.
Che ne dite di protobuf-net?Fa tutto questo e non presenta i problemi di versione associati a BinaryFormatter.Poiché è basato sul formato "buffer di protocollo" di Google, lo è progettato essere tollerante alla versione ed estensibile (informativa:Sono l'autore, quindi potrei essere di parte).
In alternativa, DataContractSerializer
supporta la serializzazione sul campo;basta impostare [DataMember]
rispetto ai campi anziché alle proprietà (richiede .NET 3.0).
Altri suggerimenti
Sì, dovresti implementare ISerializable.
I punti chiave sono i seguenti
- Implementare GetObjectData (informazioni su SerializationInfo, contesto StreamingContext).Qui è necessario aggiungere coppie di chiavi nell'oggetto informazioni.
- Implementare il costruttore di serializzazione MyClass (informazioni su SerializationInfo, contesto StreamingContext).Qui dovresti ottenere i valori dall'oggetto info.