2008-10-15 2 views
8

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

В прошлом году, мы строим для .NET 1.1, и побежал в сложный вопрос, где

  • наш код побежал на .NET 2.0
  • клиент обновлен с некоторым программным обеспечением, которое каким-то образом установить 1.1 по умолчанию
  • нашего код работал на .NET 1.1 и не смогли десериализации сохраненного состояния

этого конкретный вопрос «решен» запрещая этого конкретное обновление программного обеспечения, и не должна быть пробами lem теперь, когда мы ориентируемся на платформу .NET 2.0 (поэтому мы не можем запускаться в версии 1.1).

Какова вероятность того, что эта сериализация может снова измениться несовместимо между 2.0 и более новыми фреймами? Если мы используем <supportedVersion>, чтобы исправить наш код до 2.0.50727, каковы шансы на изменение между 2.0.50727.1434 и 2.0.50727.nnnn (некоторые будущие выпуски)? Сериализуемыми структурами данных являются массивы, карты, строки и т. Д. Из стандартных библиотек классов.

Кроме того, гарантировано ли, что структура 2.0.50727 будет всегда установлена ​​даже после дополнительных обновлений .NET? Приветствуются указатели на документацию Microsoft.

ответ

6

Шансы низкие (но не ноль!), Что будут изменения между версиями каркаса. Предполагается, что вы должны иметь возможность использовать двоичную сериализацию и удаленное взаимодействие для обмена данными между клиентом и сервером, использующим разные версии фреймворка. Несовместимость между .NET 1.x и 2.0 is a bug, для которой доступен патч.

Однако двоичная сериализация имеет другие проблемы, особенно плохую поддержку для управления версиями структуры, которую вы сериализуете.Из описанного вами варианта использования сериализация Xml является очевидным выбором: DataContractSerializer является более гибким, чем XmlSerializer, если вы не против зависимости от .NET 3.x.

Вы не можете гарантировать, что .NET framework 2.0 всегда будет установлен в будущих версиях Windows. Но я уверен, что Microsoft будет работать, чтобы гарантировать, что большинство .NET 2.0 приложения будут работать без изменений на .NET 4.x и более поздних версий. У меня нет ссылок на это: любое подобное обязательство в любом случае действительно применимо только к следующей версии Windows (Windows 7).

+1

Я согласен с большинством из этого, но я не вижу точку Windows 7 ... Я не знаю огромной суммы ни о .NET 4.x, ни о Windows 7, но я ожидал бы, что .NET 4.x будет Vista и/возможно/XP совместим. Конечно, я мог бы быть невежественным; -p – 2008-10-15 07:52:56

3

Какой сериализатор вы используете? Во многих отношениях сериализатор, такой как XmlSerializer или DataContractSerializer, буферизует вас из многих деталей и предоставляет более простые варианты расширяемости. В какой-то момент новая версия CLR, несомненно, будет необходима, поэтому я не думаю, что никто не может делать никаких гарантий относительно 2.0.50727; вы должны быть в безопасности в краткосрочной перспективе. И я хотел бы надеяться на меньшее количество разрушающих изменений ...

[обновлено следующее примечание на другой ответ]

Если вы хотите двоичный формат по причинам пространства/производительность, то другой вариант использовать другой двоичный сериализатор. Например, protobuf-net работает во всех версиях .NET *, но бинарный формат (dvised by Google) совместим с кросс-платформой (Java, C++ и т. Д.), Что делает его очень портативным, быстрым и малым.

* = Я не пробовал это на микро-каркасе, но поддерживаются CF, Silverlight, Mono, .NET 2.0 и т. Д.

4

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

+1

Чтобы это понять; BinaryFormatter и т. Д./Имеют/имеют проблемы ... существуют двоичные форматы, ориентированные на данные, а не ориентированные на тип, и для этой цели можно счесть «плотным xml». «protobuf-net» является одним из них; -p – 2008-10-15 06:09:49

2

Если проблема связана с совместимостью, возможно, вы можете найти интерфейс ISerializable. Этот интерфейс дает вам больше контроля над тем, как элементы сериализованы. Для получения дополнительной информации попробуйте это article on msdn.

2

У меня есть две вещи, чтобы добавить другие ответы ...

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

Во-вторых, я считаю обязательным написать подробные модульные тесты для любых сохраненных данных. Я всегда делаю два теста в частности:

  1. Тест на кругосветное путешествие - можете ли вы сериализовать и десериализовать свои объекты и получить то же самое?
  2. Испытание импорта Legacy - убедитесь, что у вас выпущены версии сериализованных данных из каждой выпущенной версии вашего приложения. Импортируйте данные и убедитесь, что все возвращается в ожидании.
0

Вам не нужно использовать XML, чтобы получить более высокую гибкость и управление версиями.

Я использовал библиотеку с открытым исходным кодом Саймона Хьюитта, см. Optimizing Serialization in .NET - part 2 вместо стандартной сериализации .NET. Он предлагает некоторую автоматизацию, но по существу вы можете управлять потоком информации, сериализованной и десериализованной. Для версии (версия) версия может быть сначала сериализована, а при время десериализации, как интерпретируется поток информации, зависит от версии.

Это довольно просто сделать, хотя и несколько утомительно из-за явной сериализации/десериализации данных .

В качестве бонуса он в 20-40 раз быстрее и занимает меньше места для больших наборов данных (но может быть неважным в вашем случае).