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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 10 февраля 2012

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

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

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

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

1 голос
/ 10 февраля 2012

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

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

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

1 голос
/ 10 февраля 2012

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

...