Jeśli chcę serializować obiekt, muszę użyć atrybutu [Serializable]
, a wszystkie zmienne składowe zostaną zapisane w pliku. Czego nie wiem, jak wykonywać wersjonowanie, np. jeśli dodaję nową zmienną składową (zmieniam nazwę zmiennej lub po prostu usuwam zmienną), a następnie otwieram (deserializuję) plik, w jaki sposób mogę określić wersję obiektu/pliku, aby poprawnie ustawić nowego członka lub przeprowadzić migrację? Jak ustalić, czy zmienna została zainicjowana podczas ładowania, czy nie (ignorowana przez deserializer).Serializacja i wersjonowanie obiektów w C#
Wiem, że istnieją podejścia tolerancyjne dla wersji i mogę oznaczyć zmienne atrybutem [OptionalField(VersionAdded = 1)]
. Jeśli otworzę stary plik, framework zignoruje tę opcjonalną (nową zmienną) i będzie to zero/zero. Ale znowu, jak mogę określić, czy zmienna jest inicjowana przez obciążenie, czy została zignorowana.
Mogę wpisać numer wersji klasy/obiektu do strumienia. Użyj metody ISerializable
iw metodzie constructor(SerializationInfo oInfo, StreamingContext context)
odczytaj numer wersji. To dokładnie powie mi, jaka jest wersja klasy w strumieniu.
Jednak spodziewałem się, że taka wersja jest już zaimplementowana przez framework strumieniowania w języku C#. Próbowałem uzyskać wersję Assembly z wersji SerializationInfo
, ale zawsze jest ona ustawiona na aktualną wersję, a nie wersję używaną przy zapisywaniu obiektu.
Jakie jest preferowane podejście? Znalazłem wiele artykułów w internecie, ale nie mogłem znaleźć dobre rozwiązanie dla tego, który rozwiązuje wersjonowanie ...
Każda pomoc jest mile widziana Dzięki, Abyss
+1 za sugerowanie zastosowania podejścia innego niż serializacja .NET. – Theraot