Сериализация классов, содержащих дженерики, с обратной совместимостью

StackOverflow https://stackoverflow.com/questions/755723

Вопрос

Я пытаюсь найти лучший способ обработки сериализации в моей программе.

Я хочу сериализовать частные поля (поэтому XML Serializer не является вариантом), я хочу сериализовать общие типы, такие как BindingList (Soapserializer - это не вариант). Я также хочу обеспечить некоторый уровень поддержки для возможности десериализации объектов из предыдущих версий моей программы.

Так что все, что, как мне кажется, мне осталось, это BinarySerializer и реализация интерфейса ISerializable для обеспечения прямой совместимости.

Это верно?

Примечание:Должен сказать, что я нашел этот проект.Однако проект казался мертвым, и я не мог заставить его работать (ошибка отсутствия файла)http://sourceforge.net/project/showfiles.php?group_id=196509

Это было полезно?

Решение

С BinaryFormatter, вы можете использовать [OptionalField], но это еще очень хрупкий.

Как насчет protobuf-net?Делает все это и не имеет проблем с управлением версиями, связанных с BinaryFormatter.Поскольку он основан на формате «буферов протокола» Google, он разработанный быть терпимым к версиям и расширяемым (раскрытие:Я автор, поэтому могу быть предвзятым).

Альтернативно, DataContractSerializer поддерживает сериализацию полей;просто установил [DataMember] против ваших полей вместо свойств (требуется .NET 3.0).

Другие советы

Да, вам нужно будет реализовать ISerializable.

Ключевыми моментами являются следующие

  • Реализуйте GetObjectData (информация SerializationInfo, контекст StreamingContext).Здесь вам нужно добавить пары ключей в информационный объект.
  • Реализуйте конструктор сериализации MyClass (информация SerializationInfo, контекст StreamingContext).Здесь вам нужно будет получить значения из информационного объекта.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top