Сериализация классов, содержащих дженерики, с обратной совместимостью
-
09-09-2019 - |
Вопрос
Я пытаюсь найти лучший способ обработки сериализации в моей программе.
Я хочу сериализовать частные поля (поэтому 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).Здесь вам нужно будет получить значения из информационного объекта.