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
+1 per suggerire di utilizzare un approccio diverso dalla serializzazione .NET. – Theraot