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


84

Мій настільний додаток серіалізує об'єкти, що використовують XmlSerializer. Мені запропонували скористатися цим DataContractSerializer.
За яких сценаріїв слід використовувати DataContractSerializer?

Дуже дякую

Коментарі.
1. Вихідний файл XML зберігається локально. Жодні інші програми не десеріалізують об’єкти з цього XML-файлу.
2. Моя програма працює з .NET Framework 3.5 SP1.


Також див. Datacontract-vs-xmltype
nawfal

Відповіді:


112

Ден Рігсбі має остаточну публікацію щодо цього - читайте!

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

Він каже все, що можна сказати, і дуже переконливо.

Коротко:

XmlSerializer:

  • існує довгий час
  • є "відмова"; все загальнодоступне серіалізується, якщо ви не скажете йому цього не робити ([XmlIgnore])

DataContractSerializer:

  • нова дитина в місті
  • оптимізовано для швидкості (зазвичай приблизно на 10% швидше, ніж XmlSerializer)
  • "opt-in" - лише матеріали, які ви спеціально позначили як [DataMember]серіалізовані
  • але нічого , зазначене [DataMember]буде серіалізовать - будь то publicабоprivate
  • не підтримує атрибути XML (із міркувань швидкості)

2
@ Paul-SebastianManole: DataContractSerializer не підтримує атрибути XML - із причин швидкості. Що розробити?
marc_s

6
@ Paul-SebastianManole: якщо ваш вихідний XML містить атрибути елементів XML (на зразок <Customer Id="42"> ...), тоді ви єдиним варіантом є використання серіалізатора XML
marc_s

2
Це може бути корисно, взяте з MSDN: Клас XmlSerializer підтримує набагато вужчий набір типів, ніж клас DataContractSerializer, але дозволяє набагато більше контролювати отриманий XML і підтримує набагато більше стандарту мови визначення XML Schema (XSD). Він також не вимагає жодних декларативних атрибутів для серіалізованих типів ... Клас XmlSerializer не підтримує типи контрактів даних. MSDN .
Пол-Себастьян Маноле,

1
@OO: не лише підписатись у .NET 3.5 SP1 та новіших версіях - але для мене це все ще найкращий спосіб робити щось. Дозволяє встановлювати властивості, які інакше неможливо встановити (наприклад, порядок серіалізації, простори імен та багато іншого!)
marc_s

17
Найбільше попередження про DataContractSerializer - під час десеріалізації він дбає про порядок елементів і мовчки виходить з ладу, якщо вони неправильні. Імхо, якщо ви не використовуєте абсолютно однакові вузли на обох кінцях, це робить це невиправдано небезпечним.
Pxtl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.