2009-12-29 3 views
5

я ве смотрел на это некоторое время теперьXML сериализация - Когда использовать DataContractSerializer/Binary/XMLSerialiser

кажется, что двоичная сериализация не одобряется, поскольку любое изменение имен полей разбивает сериализации =? Не хорошо

XMLSerializer является проблематичным, поскольку вы должны предоставить конструктор без ARG и открытые поля, хотя вы имеете больший контроль над элементами которого являются атрибуты или элементы и их наименования

DataContractSerializer это хорошо, но все suclassses должны быть явно добавлено, что стыдно

Однако я наткнулся на NetDataContractSerializer, который не имеет этого ограничения.

Если ваша цель - сериализация C# и никаких больших ограничений на размер xml, это NetDataContractSerializer всегда путь сюда?

ответ

10

Dan Rigsby имеет действительно хорошую сравнительную статью на XmlSerializer vs. DataContractSerializer, а также касается NetDataContractSerializer.

DataContractSerializer:

  • это быстро - около 10% быстрее, чем XmlSerializer
  • это совместимость - работает безотказно с Java, Ruby - вы называете это
  • использует явный "Опт-" модель - вам необходимо mark, что сериализуется
  • не требует конструктора
  • сериализовать непубличных членов и внутренние поля
  • не поддерживает атрибуты узлов XML

Вы говорите DCS явно , что сериализации, но не имеют большого влияния на как готово.

XmlSerializer

  • упорядочивает только открытые поля и свойства
  • упорядочивает все, кроме тех, исключить (модель отказа от применения)
  • атрибуты поддержки и все
  • это совместимость - работает безотказно с Java, Ruby - назовите его
  • требует конструктора без параметров для десериализации

Вы очень четко говорите XmlSerializer о том, как и что сериализуете, но вы не можете сериализовать все - только общедоступные свойства.

NetDataContractSerializer - это немного странность - он не совместим, он работает только в том случае, если оба конца являются .NET - он включает в себя информацию типа .NET в сообщении (что делает его больше). Вы не можете добавить его декларативно в службу WCF «из коробки».

Это сложный компромисс - как всегда. Определенно держитесь подальше от любого бинарного форматирования - это не совместимо с обратной связью, хрупким и связано с головными болями - используйте один из этих стандартных способов сделать это. Какой из них является «лучшим» для вашего данного сценария, действительно сложно рассказать - вам придется это выяснить самостоятельно ...

+2

Xml Serializer также очень совместим. Основной недостаток - это ограничения или ограничения для модели программирования (ust имеет значение по умолчанию ctor, которое должно быть сериализовано, данные должны быть общедоступными и т. Д.). ps: Сериализатор XML также сериализует общедоступные * поля *, в дополнение к свойствам. – Cheeso

+0

@ Чисо: да, спасибо - хорошие моменты –

2

Марк Гравелл показывает в своем блоге the results of a benchmark он сделал с DataContractSerializer, XmlSerializer, и большинство других сериализаторов .NET, включая protobuf-net (реализация Buffer Protocol для .NET, которую он создал).

Смежные вопросы