способы сериализации - сравнительный анализ
От: AndreiF  
Дата: 11.10.06 04:06
Оценка: 111 (14)
Здесь я решил собрать информацию о граблях, на которые я наступал в своих проектах. Надеюсь, этот список будет полезен тем, кто наступил еще не на все из них

Binary Formatter
• Требует full trust permission
• Нет средств для просмотра и анализа сгенерированных данных
• Объекты типа DataSet обрабатываются специальным образом (в .Net 1.1 они всегда сериализуются только в XML, в 2.0 их наконец можно передавать в бинарной форме – нужно всего лишь установить специальный параметр у самого объекта. Чудеса дизайна!)
• Создает неимоверно раздутые данные (иногда даже SOAP Formatter оказывается более лаконичен)

SOAP Formatter
• Не умеет работать с любыми генерик-объектами (падает при десериализации со странными ошибками, вплоть до ExecutionEngineException!)
• Требует у CAS специальное разрешение – serialization permission
• Вылетает с ошибкой при десериализации, если были сериализованы строковые переменные, содержащие символы с определенными кодами
• Неверно обрабатываются оъекты типа DateTime, если сериализация и десериализация происходят в разных временых зонах

XML Serializer
Работает только над внешним состоянием объекта – прямой доступ к данным объекта не используется.
• Не работает, если есть циркулярные зависимости между объектами.
• Накладывает ограничения на типы, которые нужно сериализовать (должен быть пустой конструктор, все сериализуемые поля должны иметь сеттеры)
• Отказывается работать, если объекты содержат поля типа Dictionary<TKey, TValue>, или любые другие производные от IDictionary<>
• Не умеет обрабатывать полиморфные переменные (требуется явно указывать, значения каких конкретных типов может принимать переменная)
• Та же самая ошибка с кодированием некоторых символов, что и у SOAP
• Требует, чтобы приложение имело полный доступ к системному каталогу TEMP (это нужно, т.к. сборка со сгенерированным кодом создается путем компиляции временного файла с исходниками, а не через Reflection.Emit)
Re: способы сериализации - сравнительный анализ
От: _FRED_ Черногория
Дата: 11.10.06 08:25
Оценка:
Здравствуйте, AndreiF, Вы писали:

AF>XML Serializer

AF>Работает только над внешним состоянием объекта – прямой доступ к данным объекта не используется.
AF>• Не работает, если есть циркулярные зависимости между объектами.
AF>• Накладывает ограничения на типы, которые нужно сериализовать (должен быть пустой конструктор, все сериализуемые поля должны иметь сеттеры)
AF>• Отказывается работать, если объекты содержат поля типа Dictionary<TKey, TValue>, или любые другие производные от IDictionary<>

IXmlSerializable разве не позволяет решить эти вопросы?
... << RSDN@Home 1.2.0 alpha rev. 652>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re[2]: способы сериализации - сравнительный анализ
От: Mika Soukhov Stock#
Дата: 11.10.06 13:11
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, AndreiF, Вы писали:


AF>>XML Serializer

AF>>Работает только над внешним состоянием объекта – прямой доступ к данным объекта не используется.
AF>>• Не работает, если есть циркулярные зависимости между объектами.
AF>>• Накладывает ограничения на типы, которые нужно сериализовать (должен быть пустой конструктор, все сериализуемые поля должны иметь сеттеры)
AF>>• Отказывается работать, если объекты содержат поля типа Dictionary<TKey, TValue>, или любые другие производные от IDictionary<>

_FR>IXmlSerializable разве не позволяет решить эти вопросы?


Как показывает практика, проще все написать с помощью System.Xml, чем реализовать IXmlSerializable. Тем более этот интерфейс в третьей версии, скорее всего, уже не так будет сильно нужен.
Re[2]: способы сериализации - сравнительный анализ
От: AndreiF  
Дата: 12.10.06 02:25
Оценка: +1
Здравствуйте, _FRED_, Вы писали:

_FR>IXmlSerializable разве не позволяет решить эти вопросы?


В принципе, позволяет. Но роль XmlSerializer в этом процессе будет сводиться к тому, чтобы дернуть методы ReadXml/WriteXml, которые напишет полностью вручную программист
Re: способы сериализации - сравнительный анализ
От: Andy77 Ниоткуда  
Дата: 10.11.06 19:00
Оценка: 1 (1)
Здравствуйте, AndreiF, Вы писали:

AF>XML Serializer

+ Невозможно научить его сериализовывать/десериализовывать "чужие" классы, вследствие чего приходится писать невероятно кривой код для сериализации, скажем, Color.
+ Невозможно загрузить сериализованные данные в уже существующий экземпляр класса. Пришлось писать свой простенький сериализатор на Reflection.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.