создание версий сериализованных файлов - PullRequest
3 голосов
/ 26 марта 2009

У меня есть работающее приложение, которое сериализует документ (типа IDocument) на диск. Оттуда я сделал еще одно приложение, которое может открыть этот документ (IDocument реализует IPrintDocument) для просмотра.

Давайте предположим, что я записал IDocument на диск, а затем через неделю поле добавляется в объект IDocument. И программа, которая записывает файлы, и та, которая их открывает, обновляются этой новой «версией» IDocument. Затем он сломается (я полагаю - не было возможности проверить, я смотрю вперед) при попытке открыть предыдущую версию IDocument. Существует ли известная модель, которая устраняет подобные проблемы?

Ответы [ 3 ]

4 голосов
/ 26 марта 2009

Да - использовать механизм сериализации, который допускает управление версиями .

Достаточно предсказуемо, я собираюсь предложить использовать Протоколные буферы Google , для которых есть как минимум две жизнеспособные .NET реализации. Пока вы осторожны, буфер протокола совместим как с обратной, так и с прямой пересылкой - вы можете прочитать новое сообщение со старым кодом и наоборот, и старый код все равно сможет сохранить информацию, которую он не понимает.

Другой альтернативой является XML, независимо от того, используется ли в .NET встроенная XML-сериализация или нет. Насколько мне известно, встроенная сериализация не особенно гибка с точки зрения управления версиями.

3 голосов
/ 26 марта 2009

Встроенная сериализация .net является дополнительной опцией, но она требует, чтобы вы добавляли заполнители для определенных частей, которые вы хотите расширить в будущем.

Вы добавляете заполнители для дополнительных элементов / атрибутов, например, следующий код:

[XmlAnyElement()]
public XmlElement[] ExtendedElements { get; set; }
[XmlAnyAttribute()]
public XmlAttribute[] ExtendedAttributes { get; set; }

Добавляя вышеупомянутое в соответствующие классы, вы можете эффективно читать сохраненную информацию, которая имеет дополнительные элементы / атрибуты, изменять обычные свойства, которые программа знает, как обрабатывать, и сохранять ее. Это учитывает как обратную, так и прямую совместимость. При добавлении нового поля просто добавьте желаемое свойство.

Обратите внимание, что вышеперечисленное ограничено расширением в указанных крючках.

Обновление: Как упоминал Джон в комментарии, приведенное выше будет работать только для сериализации xml. Насколько я знаю, двоичная сериализация не поддерживает нечто подобное. В двоичной сериализации вы можете получить как старую / новую версию приложения, чтобы иметь возможность читать сериализованную информацию друг друга (.net 2.0+), но если вы сохраните ее обратно, вы потеряете дополнительную информацию, которую версия не обрабатывает.

Начиная с .net 2.0, процесс десериализации игнорирует дополнительные данные, если вы объедините их с необязательными полями, вы можете эффективно заставить оба приложения читать форматы других версий. Проблема в том, что данные не удерживаются классом, как в полях xml.

Некоторые ссылки: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationbinder.aspx, http://msdn.microsoft.com/en-us/library/ms229752.aspx

Если вы не хотите сериализации XML, я бы пошел с подходом Джона.

Ps. Я не знаю, есть ли какая-нибудь хорошая сторонняя реализация, к которой мы можем получить доступ, которая расширяет двоичную сериализацию для хранения и сохранения дополнительных данных.

1 голос
/ 26 марта 2009

Встроенная сериализация должна дать вам минимальный допуск на обновления версий с использованием атрибута [OptionalField]. Но вещи могут стать действительно очень быстрыми , так что вам лучше взглянуть на использование фреймворка, решающего эти проблемы, такого как протобуферы Jons и т. Д.

Другая пара вариантов - использование встроенной БД, такой как Sqlite , для вашего хранилища документов. И вручную (или используя ORM) сопоставьте свойства / поля в вашем объекте со столбцами в таблице.

или

Используйте Lucene , который также даст вам полнотекстовый поиск по вашим документам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...