由于XML节点的排序不正确,DataContract反序列化失败

Sch*_*999 8 c# xml wcf datacontractserializer

我对DataContractSerializer的行为感到困惑.我们的配置基于XML.XML用作DataContractSerializer.ReadObject方法的源.最近,当没有设置反序列化对象的某些属性时,我遇到了一个问题.我已跟踪更改并发现这些属性已手动添加到XML中.在我看来哪个好.显然,在DataContractSerializer看来它不行,因为它似乎期望XML节点按字母顺序排序.真?!反序列化似乎非常简单 - 按顺序读取XML,解析节点名称,设置相应的属性.订购的目的是什么?

有解决方法吗?也许是DataContractSerializer的某种设置?

ta.*_*.is 3

我最近遇到了这个问题。为了解决这个问题,我使用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"

...
Run Code Online (Sandbox Code Playgroud)

我的博客文章中有更多信息。

如果您想知道为什么顺序很重要,那是因为sequenceXSD 中的 a 有定义的顺序,并且 Web 服务契约是使用 XSD 定义的。

规格来看

这一定义的结果是,出现在其类型声明为 USAddress 的实例中的任何元素(例如 po.xml 中的 ShipTo)必须由 5 个元素和 1 个属性组成。这些元素必须称为 name、street、city、state 和 zip(由声明的 name 属性值指定),并且这些元素必须以与声明它们相同的顺序(顺序)出现。