2013-03-26 12 views
11

Se desidero serializzare un oggetto, devo utilizzare l'attributo [Serializable] e tutte le variabili membro verranno scritte nel file. Quello che non so come fare il controllo delle versioni, ad es. se aggiungo una nuova variabile membro (rinomina una variabile o rimuovi solo una variabile) e poi apro (deserializza) il file come posso determinare la versione dell'oggetto/file in modo da poter impostare correttamente il nuovo membro o prendere una sorta di migrazione? Come posso determinare che la variabile è stata inizializzata durante il caricamento o meno (ignorata dal deserializzatore).Serializzazione e controllo delle versioni degli oggetti in C#

So che esistono approcci tolleranti alla versione e posso contrassegnare le variabili con l'attributo [OptionalField(VersionAdded = 1)]. Se apro un vecchio file, il framework ignorerà questo opzionale (nuova variabile) e sarà solo zero/nullo. Ma ancora come posso determinare se la variabile è inizializzata dal carico o è stata ignorata.

Posso scrivere il numero di versione di classe/oggetto nello stream. Utilizzare l'approccio ISerializable e nel metodo constructor(SerializationInfo oInfo, StreamingContext context) leggere questo numero di versione. Questo mi dirà esattamente qual è la versione della classe nello stream.

Tuttavia mi aspettavo che questo tipo di controllo delle versioni sia già implementato dal framework di streaming in C#. Ho provato ad ottenere la versione Assembly dal SerializationInfo ma è sempre impostata sulla versione corrente non sulla versione che è stata utilizzata quando l'oggetto è stato salvato.

Qual è l'approccio preferito? Ho trovato un sacco di articoli sulla rete, ma non riuscivo a trovare una buona soluzione per questo che si occupa delle versioni ...

Ogni aiuto è apprezzato Grazie, Abyss

risposta

2

Perdonami se un po 'di quello che ho scrivere è troppo ovvio,

Prima di tutto, per favore! devi smettere di pensare che stai serializzando un oggetto ... Questo è semplicemente scorretto in quanto i metodi che fanno parte dell'oggetto non vengono mantenuti. Si stanno conservando le informazioni - e quindi .. solo DATA.

Serializzazione .NET che serializza anche il nome tipo dell'oggetto che contiene il nome dell'assembly e la sua versione, quindi quando si deserializza - confronta le informazioni sull'assieme persistente con il tipo che verrà manifestato con le informazioni - se non lo sono lo stesso restituirà un'eccezione.

Accanto al problema di versione - non tutto può essere serializzato così facilmente .. prova a serializzare un tipo System.Drawing.Color e inizierai a capire i problemi con il meccanismo semplicistico della serializzazione .NET.

A meno che non si pianifichi di serializzare qualcosa di veramente semplice che non ha intenzione di evolvere, non utilizzerei il meccanismo di serializzazione fornito da .NET.

Per riportare l'attenzione sulla tua domanda, puoi leggere qui sull'abilità dell'ignoranza delle versioni: http://msdn.microsoft.com/en-us/library/ms229752(v=vs.80).aspx fornita per BinaryFormatter.

Si dovrebbe anche controllare la serializzazione XML che ha alcune belle abilità, ma il più grande vantaggio è che si ottenere un XML che è umano leggibile in modo che i dati non saranno mai perso, anche se si ha complicazioni con il controllo delle versioni dei tuoi tipi.

Infine, ti consiglio di utilizzare Database con Entity Framework per mantenere i tuoi dati o scrivere il tuo gestore di file flat ..mentre EF è ottimo per la maggior parte delle soluzioni, a volte potresti desiderare qualcosa di più leggero per mantenere qualcosa di molto semplice. (il mio implica è che non riesco più a vedere una soluzione in cui .NET serializzazione può essere rilevante.)

Spero che questo aiuta, buona fortuna.

+1

+1 per suggerire di utilizzare un approccio diverso dalla serializzazione .NET. – Theraot