Здесь я решил собрать информацию о граблях, на которые я наступал в своих проектах. Надеюсь, этот список будет полезен тем, кто наступил еще не на все из них
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)
Здравствуйте, AndreiF, Вы писали:
AF>XML Serializer
AF>Работает только над внешним состоянием объекта – прямой доступ к данным объекта не используется.
AF>• Не работает, если есть циркулярные зависимости между объектами.
AF>• Накладывает ограничения на типы, которые нужно сериализовать (должен быть пустой конструктор, все сериализуемые поля должны иметь сеттеры)
AF>• Отказывается работать, если объекты содержат поля типа Dictionary<TKey, TValue>, или любые другие производные от IDictionary<>
IXmlSerializable разве не позволяет решить эти вопросы?
... << RSDN@Home 1.2.0 alpha rev. 652>>
Now playing: «Тихо в лесу…»
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, AndreiF, Вы писали:
AF>>XML Serializer
AF>>Работает только над внешним состоянием объекта – прямой доступ к данным объекта не используется.
AF>>• Не работает, если есть циркулярные зависимости между объектами.
AF>>• Накладывает ограничения на типы, которые нужно сериализовать (должен быть пустой конструктор, все сериализуемые поля должны иметь сеттеры)
AF>>• Отказывается работать, если объекты содержат поля типа Dictionary<TKey, TValue>, или любые другие производные от IDictionary<>
_FR>IXmlSerializable разве не позволяет решить эти вопросы?
Как показывает практика, проще все написать с помощью System.Xml, чем реализовать IXmlSerializable. Тем более этот интерфейс в третьей версии, скорее всего, уже не так будет сильно нужен.
Здравствуйте, _FRED_, Вы писали:
_FR>IXmlSerializable разве не позволяет решить эти вопросы?
В принципе, позволяет. Но роль XmlSerializer в этом процессе будет сводиться к тому, чтобы дернуть методы ReadXml/WriteXml, которые напишет полностью вручную программист