DataContractSerializer против XmlSerializer: плюсы и минусы каждого сериализатора

86

Мое настольное приложение сериализует объекты, используя XmlSerializer. DataContractSerializerВместо этого мне предложили использовать рычаги .
В каких сценариях я должен использовать DataContractSerializer?

Большое спасибо

Комментарии.
1. Выходной файл XML хранится локально. Никакие другие приложения не десериализуют объекты из этого XML-файла.
2. Мое приложение работает с .NET Framework 3.5 SP1.

Виталий Клименко
источник
Также см. Datacontract-vs-xmltype
nawfal

Ответы:

114

У Дэна Ригсби есть последняя статья по этому поводу - прочтите ее!

XmlSerializer против DataContractSerializer (веб-архив)

Он говорит все, что можно сказать, и очень убедительно.

Коротко:

XmlSerializer:

  • существует уже давно
  • это «отказ»; все общедоступное будет сериализовано, если вы не укажете ([XmlIgnore])

DataContractSerializer - это:

  • новый ребенок в городе
  • оптимизирован по скорости (обычно примерно на 10% быстрее, чем XmlSerializer)
  • "opt-in" - [DataMember]сериализуется только то, что вы специально отметили как
  • но ничего , отмеченное [DataMember]будет сериализовать - будь то publicилиprivate
  • не поддерживает атрибуты XML (из соображений скорости)
marc_s
источник
2
@ Paul-SebastianManole: DataContractSerializer не поддерживает атрибуты XML - из соображений скорости. Что уточнить?
marc_s
6
@ Paul-SebastianManole: если ваш исходный XML содержит атрибуты элементов XML (например, <Customer Id="42"> ...), тогда единственный вариант - использовать сериализатор XML
marc_s
2
Это может быть полезно, взято из MSDN: класс XmlSerializer поддерживает гораздо более узкий набор типов, чем класс DataContractSerializer, но обеспечивает гораздо больший контроль над результирующим XML и поддерживает гораздо больше стандарта языка определения схемы XML (XSD). Он также не требует никаких декларативных атрибутов для сериализуемых типов ... Класс XmlSerializer не поддерживает типы контрактов данных. MSDN .
Пол-Себастьян Маноле
1
@OO: не только подписка в .NET 3.5 SP1 и новее, но для меня это по-прежнему предпочтительный способ работы. Позволяет вам установить свойства, которые иначе не могут быть установлены (например, порядок сериализации, пространства имен и многое другое!)
marc_s
17
Самое большое предупреждение о DataContractSerializer - при десериализации он заботится о порядке элементов и молча терпит неудачу, если они не в правильном порядке. Imho, если вы не используете одни и те же сборки на обоих концах, это делает это чрезвычайно опасным.
Pxtl