Сериализация и управление версиями объектов в C #
Если я хочу сериализовать объект, я должен использовать[Serializable]
атрибут и все переменные-члены будут записаны в файл. Что я не знаю, как сделать управление версиями, например. если я добавляю новую переменную-член (переименовываю переменную или просто удаляю переменную), а затем открываю (десериализирую) файл, как я могу определить версию объекта / файла, чтобы я мог правильно установить новый член или выполнить какую-то миграцию? Как я могу определить, что переменная была инициализирована во время загрузки или нет (игнорируется десериализатором).
Я знаю, что есть подходы, допускающие версию, и я могу пометить переменные[OptionalField(VersionAdded = 1)]
приписывать. Если я открою старый файл, фреймворк проигнорирует этот необязательный параметр (новая переменная), и он будет равен нулю / нулю. Но опять же, как я могу определить, была ли переменная инициализирована загрузкой или она была проигнорирована.
Я могу записать номер версии класса / объекта в поток. ИспользоватьISerializable
подход и вconstructor(SerializationInfo oInfo, StreamingContext context)
Метод читать этот номер версии. Это точно скажет мне, какая версия класса в потоке.
Однако я ожидал, что такой вид управления версиями уже реализован потоковой инфраструктурой в C #. Я пытался получить версию сборки изSerializationInfo
но она всегда установлена на текущую версию, а не на версию, которая использовалась при сохранении объекта.
Какой предпочтительный подход? Я нашел много статей в сети, но я не мог найти хорошее решение для этого, которое касается управления версиями ...
Любая помощь приветствуется Спасибо, Бездна