C# 由于XML节点顺序不正确,DataContract反序列化失败
我对DataContractSerializer的行为感到困惑。我们的配置是基于XML的。XML用作DataContractSerializer.ReadObject方法的源。最近我遇到了一个问题,反序列化对象的一些属性没有设置。我跟踪了这些更改,发现这些属性是手动添加到XML中的。在我看来这是可以的。显然,DataContractSerializer认为这是不正确的,因为它似乎希望XML节点按字母顺序排列。真正地反序列化看起来非常简单——按顺序读取XML,解析节点名,设置相应的属性。订购的目的是什么C# 由于XML节点顺序不正确,DataContract反序列化失败,c#,xml,wcf,datacontractserializer,C#,Xml,Wcf,Datacontractserializer,我对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中的序列
具有已定义的顺序,并且web服务契约是用XSD定义的
发件人:
此定义的结果是,实例中出现的任何元素,如果其类型被声明为USAddress(例如po.xml中的shipTo),则必须由五个元素和一个属性组成。这些元素必须按声明的名称属性值指定的名称、街道、城市、州和邮政编码来命名,并且这些元素必须按声明的相同顺序(顺序)出现。
我明白你的意思。我想我在这种情况下是懒惰的,因为同一个对象被用作基于WCF的服务的参数,所以不考虑两种序列化方式很方便。哇。。。这似乎有点太复杂了。但是谢谢你的回答。我最终尝试了DataContractSerializer,它对我更有效。难道没有办法在DataContract中使用“xs:all”定义吗?那么顺序就无关紧要了吗?@Nicholi也许如果你能控制WSDL的话