[英]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.