繁体   English   中英

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

[英]DataContract deserialization fails due to incorrect ordering of XML nodes

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

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

您可以使用DataMemberAttribute的Order成员来帮助解决这个问题,但在大多数情况下:XML是特定于订单的(对于元素而不是属性) - 所以它没有特别错误。

这就是说:如果你想要对XML序列化进行精细控制,那么DataContractSerializer是一个糟糕的选择XmlSerializer提供了更多的控制 - 并且不那么繁琐的重新命令iirc。

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

...

我的博客文章中更多信息

如果您想知道订单的重要性,那是因为XSD中的sequence具有已定义的顺序,而Web服务合同是使用XSD定义的。

规格

此定义的结果是,出现在其类型声明为USAddress的实例中的任何元素(例如po.xml中的shipTo)必须由五个元素和一个属性组成。 这些元素必须称为名称,街道,城市,州和邮政编码,由声明的名称属性的值指定, 并且元素必须以声明它们的相同顺序(顺序)出现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM