Могут ли объекты сериализоваться / десериализоваться в разных версиях фреймворка?

Мне нужно сериализовать объект с помощью BinaryFormatter с .NET 4.0 и отправить его по сети (через SOAP в виде массива байтов) в веб-службу, работающую под .NET 3.5. И наоборот. Я тестировал этот сценарий, и, похоже, он работает нормально.

Есть один старый вопрос относительно этого сценария на SO, который говорит о .NET 1.x до 2.0, что не оставило у меня большой уверенности в подходе.

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

Как правило, могут ли объекты сериализоваться / десериализоваться в разных версиях фреймворка? Это принятый сценарий или хитрость, которая сработала в моем случае?


person AngryHacker    schedule 10.02.2012    source источник
comment
Какой тип сериализации вы используете (двоичный, XML, JSON и т. Д.)?   -  person Justin Niessner    schedule 10.02.2012
comment
Я думаю, тебе нужно перестать быть AngryHacker и стать JollyHacker, чтобы это работало лучше всего :)   -  person Mark Schultheiss    schedule 10.02.2012
comment
точно какой сериализатор вы используете? Очень важно ответить на этот вопрос.   -  person Marc Gravell    schedule 10.02.2012
comment
На самом деле двоичного кода недостаточно, чтобы ответить на этот вопрос. Несколько сериализаторов записывают нетекстовый вывод; некоторые будут работать здесь нормально (protobuf-net, BSON и т. д.) - а некоторые едва ли надежны даже в одной версии фреймворка (BinaryFormatter и т. д.). Что именно?   -  person Marc Gravell    schedule 10.02.2012
comment
@MarcGravell Извините, да, форматтер BinaryFormatter. Обновление вопроса.   -  person AngryHacker    schedule 10.02.2012


Ответы (3)


Если под «двоичным» вы имеете в виду BinaryFormatter, то он уже является крайне нетерпимым между версиями, поскольку он строго привязан к метаданным типа (если вы не очень много работаете с пользовательскими привязками). Таким образом, он является строго надежным только тогда, когда на обоих концах используются в точности одинаковые реализации. Даже изменение свойства на / из автоматически реализуемого свойства является критическим изменением.

Это не недостаток «двоичного кода», а особенность BinaryFormatter. Другие двоичные сериализаторы не имеют этой проблемы. Например, protobuf-net работает между ОС, фреймворками и т. Д., Поскольку формат a: не заботится о ваших конкретных типах, а b: закреплен за опубликованной спецификацией.

Если вы используете для этого BinaryFormatter в настоящее время: тогда, IMO, да, вы должны явно протестировать каждый API. любой тип может изменить деталь реализации. И, к сожалению, поскольку у BF есть привычка извлекать неожиданные данные (через события и т. Д.), Даже этого недостаточно для подтверждения реального использования.

person Marc Gravell    schedule 10.02.2012
comment
Объекты, которые я запускаю по сети, изолированы в отдельную сборку (которая скомпилирована в .NET 3.5). И клиент, и сервер имеют точную копию сборки, поэтому такие вещи, как изменение свойств, не являются проблемой. Кроме того, объекты являются чистыми объектами передачи данных, например нет никаких событий или чего-то подобного. Безопасен ли я в таком сценарии? - person AngryHacker; 10.02.2012
comment
@AngryHacker Я приветствую ваше хорошее планирование и дальновидность. Это фактически изолирует вас от мира боли здесь. При такой настройке я ожидал, что это сработает. Я бы удивился, если бы это не удалось, но: иногда случаются сюрпризы. - person Marc Gravell; 10.02.2012

Если формат сериализации - XML ​​(SOAP) или JSON, он не должен работать абсолютно без проблем. Я не уверен, как отреагирует двоичный сериализованный объект.

person Sam Axe    schedule 10.02.2012

Самая большая проблема с сериализацией - это когда у вас есть несуществующие примитивы. Черт, проблема существует при переходе к определенным типам в машинном коде, поэтому это не уникальная проблема, обнаруженная в сервисах (предположение).

Как «правило», вы можете сериализовать разные версии фреймворка и даже клиентам, написанным на Java, Delphi и COBOL (при условии, что версия с возможностью веб-службы - и при условии, что вы должным образом представили сериализованные объекты через конечную точку службы).

Я пытаюсь понять, есть ли в .NET примитивы, которых не было в 1.x, поскольку они были бы проблематичными. Как и любые новые объекты фреймворка, которые вы можете попытаться сериализовать. У вас намного меньше опасности с 2.0 (возможно, не существует?)

Чем более «открыта» ваша сериализация (например, стандарты, такие как JSON, SOAP и т. Д. - упрощены: JSON или XML, по крайней мере, в большинстве случаев), тем меньше вероятность возникновения проблем. И, если у вас есть проблемы, вы можете кодировать автоматические прокси и т. Д. По мере того, как вы переходите к двоичному файлу, вы можете иметь некоторую несовместимость между объектом, сериализованным в 4.0 с помощью WCF и клиентом удаленного взаимодействия.

person Gregory A Beamer    schedule 10.02.2012
comment
Я сериализую с помощью двоичного сериализатора и передаю через SOAP. Вы можете привести пример (хотя бы теоретический) несовместимости? - person AngryHacker; 10.02.2012
comment
Не сразу. Если вы сериализуете свои объекты домена (а не вещи из .NET Framework) и придерживаетесь примитивов, существовавших с версии 1.x (например, избегайте типов, допускающих значение NULL), я не думаю, что у вас возникнет проблема, даже с двоичной сериализацией. В принципе, если вы передаете состояние (базовые объекты с геттерами и сеттерами свойств и не более того) и придерживаетесь общих примитивов, все должно быть в порядке. - person Gregory A Beamer; 10.02.2012
comment
И с архитектурной точки зрения вы можете вернуться к конечной точке на основе SOAP для своих клиентов 1.x, если вы нарушили простой режим. :-) ::: Надо любить гибкость WCF. - person Gregory A Beamer; 10.02.2012
comment
Я думаю, вы неправильно поняли мой вопрос. У меня нигде в уравнении нет клиентов WCF или 1.x. Просто стандартные Web Services, соединяющие 3.5 / 4.0 штуки. - person AngryHacker; 10.02.2012