Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 由于XML节点顺序不正确,DataContract反序列化失败_C#_Xml_Wcf_Datacontractserializer - Fatal编程技术网

C# 由于XML节点顺序不正确,DataContract反序列化失败

C# 由于XML节点顺序不正确,DataContract反序列化失败,c#,xml,wcf,datacontractserializer,C#,Xml,Wcf,Datacontractserializer,我对DataContractSerializer的行为感到困惑。我们的配置是基于XML的。XML用作DataContractSerializer.ReadObject方法的源。最近我遇到了一个问题,反序列化对象的一些属性没有设置。我跟踪了这些更改,发现这些属性是手动添加到XML中的。在我看来这是可以的。显然,DataContractSerializer认为这是不正确的,因为它似乎希望XML节点按字母顺序排列。真正地反序列化看起来非常简单——按顺序读取XML,解析节点名,设置相应的属性。订购的目的

我对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的话