Сбой десериализации DataContract из-за неправильного упорядочения узлов XML - PullRequest
8 голосов
/ 21 марта 2012

Я сбит с толку поведением DataContractSerializer.Наша конфигурация основана на XML.XML используется в качестве источника для метода DataContractSerializer.ReadObject.Недавно я столкнулся с проблемой, когда некоторые свойства десериализованного объекта не были установлены.Я отследил изменения и обнаружил, что эти свойства были добавлены в XML вручную.Что нормально на мой взгляд.По-видимому, это не было хорошо, по мнению DataContractSerializer, потому что, похоже, он ожидает, что узлы XML будут упорядочены в алфавитном порядке.В самом деле?!Десериализация кажется очень простой вещью - последовательно читать XML, анализировать имя узла, устанавливать соответствующее свойство.Какова цель заказа?

Есть ли обходной путь?Может быть, какие-то настройки для DataContractSerializer?

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Я недавно столкнулся с этой проблемой. Чтобы обойти это, я использовал XmlSerializer и удалил явное упорядочение из атрибутов XmlElement:

set proxy_tool="C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SvcUtil.exe" /nologo /t:code /ser:XmlSerializer /UseSerializerForFaults
set sed_tool="$(ProjectDir)sed.exe" -r -i "s/,?[[:space:]]*Order=[[:digit:]]+//"

%proxy_tool%  /o:"Proxy1.cs" /n:*,Namespaces.Name1 "Proxy1.wsdl"
%sed_tool% "Proxy1.cs"

%proxy_tool%  /o:"Proxy2.cs" /n:*,Namespaces.Name2 "Proxy2.wsdl"
%sed_tool% "Proxy2.cs"

...

В моем блоге есть дополнительная информация .

Если вы хотите знать, почему заказ имеет значение, это потому, что sequence в XSD имеет определенный заказ, а контракты на веб-службы определяются с помощью XSD.

С Спецификация :

Следствием этого определения является то, что любой элемент, появляющийся в экземпляре, тип которого объявлен как USAddress (например, shipTo в po.xml), должен состоять из пяти элементов и одного атрибута. Эти элементы должны называться name, street, city, State и zip, как указано в значениях атрибутов name объявлений, , и элементы должны появляться в той же последовательности (порядке), в которой они были объявлены.

3 голосов
/ 21 марта 2012

Вы можете использовать член Order в DataMemberAttribute, чтобы помочь с этим, но в большинстве случаев: XML зависит от порядка (для элементов, а не атрибутов) - так что это не является конкретно неправильным.

Тем не менее, если вы хотите точно контролировать сериализацию XML, DataContractSerializer - плохой выбор, XmlSerializer предлагает больший контроль и менее сложный порядок заказа iirc.

...