Serializacja i wersjonowanie obiektów w C #

Jeśli chcę serializować obiekt, muszę go użyć[Serializable] atrybut i wszystkie zmienne członkowskie zostaną zapisane w pliku. Co nie wiem, jak zrobić wersjonowanie, np. jeśli dodam nową zmienną składową (zmień nazwę zmiennej lub po prostu usuwam zmienną), a następnie otwieram (deserializuję) plik, w jaki sposób mogę określić wersję obiektu / pliku, aby móc poprawnie ustawić nowego członka lub wykonać jakąś migrację? Jak mogę określić, że zmienna została zainicjowana podczas ładowania lub nie (ignorowana przez deserializer).

Wiem, że istnieją podejścia tolerancyjne dla wersji i mogę oznaczyć zmienne[OptionalField(VersionAdded = 1)] atrybut. Jeśli otworzę stary plik, framework zignoruje to opcjonalnie (nowa zmienna) i będzie to zero / null. Ale znowu, jak mogę określić, czy zmienna jest inicjowana przez obciążenie, czy została zignorowana.

Mogę zapisać numer wersji klasy / obiektu do strumienia. UżyjISerializable podejście i wconstructor(SerializationInfo oInfo, StreamingContext context) metoda przeczytaj ten numer wersji. To dokładnie powie mi, jaka jest wersja klasy w strumieniu.

Spodziewałem się jednak, że taki rodzaj wersjonowania jest już zaimplementowany przez framework strumieniowy w C #. Próbowałem uzyskać wersję Assembly zSerializationInfo ale zawsze ustawiana jest bieżąca wersja nie na wersję, która była używana podczas zapisywania obiektu.

Jakie jest preferowane podejście? Znalazłem wiele artykułów w sieci, ale nie mogłem znaleźć dobrego rozwiązania tego problemu dotyczącego wersjonowania ...

Każda pomoc jest doceniana Dzięki, Abyss

questionAnswers(1)

yourAnswerToTheQuestion