Как обрабатывать изменения сериализации в .NET 2.0 - PullRequest
1 голос
/ 09 апреля 2009

.NET 2.0 представила VTS (версия с толерантной сериализацией, http://msdn.microsoft.com/en-us/library/ms229752(VS.80).aspx)

Простой тестовый проект показывает, что стандартное поведение в 2.0 - не генерировать исключение сериализации, если поле добавлено в класс, затем делается попытка десериализации экземпляра этого класса из двоичной сериализации экземпляра класса у которого не было нового поля.

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

Помимо нарушения обратной совместимости (код, основанный на генерируемых исключениях, больше не работает), есть еще большая проблема: в 2.0 нет очевидного способа эмулировать поведение 1.1.

Как эмулировать поведение «исключение выброса при пропущенных / лишних полях» 1.1 в версии 2.0?

Большое спасибо, Мирон

Ответы [ 2 ]

2 голосов
/ 09 апреля 2009

Только поля, к которым применен атрибут OptionalFieldAttribute, должны игнорировать недостающую информацию во время десериализации. Простое удаление этого атрибута должно вызвать исключение и привести к тому же поведению, что и в .NET Framework 1.1.

Обновление:

Преступник должен быть свойством AssemblyFormat класса BinaryFormatter, который по умолчанию равен FormatterAssemblyStyle.Full в 1.1, но по умолчанию равен 2.0 FormatterAssemblyStyle.Simple.

Фактически, установка этого параметра в FormatterAssemblyStyle.Simple в 1.1 приведет к тому же поведению, что и в 2.0: исключение не выдается. Наконец, в .NET 2.0 у вас есть атрибут OptionalFieldAttribute, который будет более детализированным.

Так что установите это свойство в FormatterAssemblyStyle.Full и посмотрите, что оно делает.

См. Также здесь .

2 голосов
/ 09 апреля 2009

Как правило, люди хотят иметь возможность, по крайней мере, десериализовать старые данные, независимо от изменений в дизайне класса. К сожалению, BinaryFormatter (основанный на полях) здесь очень хрупкий - даже переключение на автоматически реализованные свойства может сломать вещи .

Лично я буду проектировать вокруг контрактов данных или подобных структур, которые не специфичны для реализации, а являются расширяемыми. Для двоичного кода protobuf-net находит широкое применение в этой области.

Если вы действительно хотите эмулировать поведение 1.1 - внедрите ISerializable вручную и сгенерируйте исключение (или нет).

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