2012-06-12 4 views
2

Я пытаюсь обернуть голову вокруг сериализации. Но что произойдет, если по каким-то причинам мне нужно добавить или удалить некоторые значения или свойства? Как это повлияет на содержание? Или это не проблема? Или как я могу избежать этого?Сериализация: Будет ли изменение базового класса проблемой?

+0

Это зависит от того, какой механизм сериализации вы используете. BinaryFormatter? XmlSerializer? Json.NET? Это умеренно сложная тема. –

+0

О, извините. Я использовал XmlSerializer для обучения, а затем планировал переход на BinaryFormatter для хранения SQL. Это сложнее, чем я думал, я так понимаю? –

+0

Я настоятельно рекомендую вам ** не ** переходить в BinaryFormatter для хранения SQL - это не (IMO), хорошо подходящее для хранения в течение любой продолжительности. Я смиренно представляю protobuf-net, возможно, лучший выбор (я автор, он бесплатный и т. Д., И разработан специально, чтобы избежать многих проблем в BinaryFormatter) –

ответ

2

Как уже отмечалось, это зависит от вашего сериализатора. XmlSerializer в этом случае несколько проще:

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

Рассмотрите аннексию Джона для получения дополнительных советов, особенно с NonSerialized и OptionalField атрибутами.

1

Все зависит от того, какой метод сериализации вы используете, и если вы планируете десериализацию устаревших объектов.

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

Для BinaryFormatter и SoapFormatter:

  • При добавлении новых свойств, вам нужно будет украсить их с OptionalField Attribute, так что вы все еще можете десериализации старые версии вашего объекта, которые не имеют новое поле.
  • Если вы «удаляете» свойства, вам придется оставить их в коде, но украсить их OptionalField Attribute, чтобы вы все еще могли десериализовать более старые версии вашего объекта, у которых все еще есть удаленное поле.
1

Я могу говорить для XmlSerializer, так как он широко используется в моем собственном проекте.

Добавление свойств не вызывает никаких проблем с XmlSerializer, недостающие свойства из сериализованного xml просто сохраняют значение по умолчанию. Эффект удаления или переименования существующих свойств - это просто потеря данных. Если вы не имеете дело с исходным xml AS xml или текстовым файлом, данные в удаленных или переименованных свойствах просто теряются. Для добавления, удаления или переименования свойств при использовании XmlSerializer специальных атрибутов не требуется.

Смежные вопросы