Объекты, используемые для сериализации данных, изменились.Как сериализованные данные могут быть обновлены для новых объектов? - PullRequest
1 голос
/ 14 января 2011

У меня есть несколько простых экземпляров сущностей, которые я сериализовал в файл. В будущем я знаю, что структура этих объектов (то есть, может быть, я переименую имя в заголовок или что-то). Дело в том, что я не хочу потерять данные, которые я сохранил во всех этих старых файлах. Что является правильным способом либо

  1. загрузка данных из старых сущностей в новые сущности
  2. обновить старые файлы, чтобы их можно было использовать с новыми сущностями

Примечание: я думаю, что застрял с двоичной сериализацией, а не с сериализацией XML.

Заранее спасибо!

Редактировать: Итак, у меня есть ответ на случай, который я описал. Я могу использовать dataContractSerializer и сделать что-то вроде

[DataMember("bar")]
private string foo;

и измените имя в коде и оставьте то же имя, которое использовалось для сериализации. Но как насчет следующих дополнительных случаев:

  1. У исходного объекта есть новые члены, которые можно сериализовать
  2. Некоторые сериализованные элементы, которые были в исходной сущности, удаляются
  3. Некоторые члены фактически изменили свою функцию (предположим, что в исходном классе были члены FirstName и LastName, и он был реорганизован, чтобы иметь только элемент FullName, который объединяет оба)

Чтобы справиться с этим, мне нужен какой-то класс десериализации переводчика / переводчика, но я понятия не имею, что мне следует использовать

Ответы [ 3 ]

2 голосов
/ 14 января 2011

Если вы использовали BinaryFormatter, обратите внимание, что это сериализатор , а не сериализатор свойств;вы можете взломать его, не меняя имен полей.Если это не реализованное автоматически свойство, в этом случае вы не можете.

Если честно, BinaryFormatter - плохой выбор, если вы хотите гибко изменять типы.Контрактный сериализатор гораздо более гибок.Например, XmlSerializer и DataContractSerializer позволяют управлять именами через атрибут.

Если вам нужен двоичный файл, я бы выбрал protobuf-net (возможно, потому что я написал это) - здесь без имен - только числовые идентификаторы.Но формат protobuf был разработан Google , в частности , чтобы позволить безболезненное обновление API.

Конечно, вы также можете рассматривать DTO как постоянный контракт;в этом случае подумайте о том, чтобы иметь DTO v1, DTO v2 и т. д. Не так, как я склонен делать это сам, но определенно вариант.

0 голосов
/ 14 января 2011

Вам нужно написать программу, которая

  • десериализует данные в старую версию сущности
  • преобразует старую версию сущности в новую версиюentity
  • сериализует новую версию объекта обратно в файл.

Если вы сериализовали его в XML, вы, вероятно, могли бы написать XSLT, чтобы внести необходимые изменения напрямую.

0 голосов
/ 14 января 2011

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

...