способы сериализации - сравнительный анализ
От: 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)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.