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