DataContractSerializer和反序列化Web服务响应类型

mat*_*tra 3 c# wcf web-services datacontractserializer

我正在使用调用Web服务并在客户端上使用WCF生成的服务引用.我已经保存了从测试服务接收到磁盘的XML响应(没有SOAP信封和正文标记)我想从磁盘加载它们并从它们创建对象.让我们从我的网络服务中采取以下方法:

SomeMethodResponse SomeMethod(SomeMethodRequest req)
Run Code Online (Sandbox Code Playgroud)

我手动(通过SOAP UI)将响应保存到磁盘到文件,Sample响应:

<SomeMethodResponse xmlns="http://myNamespace">
    <SomeMember1>value</SomeMember1>
</SomeMethodResponse>
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用以下命令从文件反序列化对象:

DataContractSerializer dcs = 
  new DataContractSerializer(typeof(SomeMethodResponse))
Run Code Online (Sandbox Code Playgroud)

这失败了 - 序列化程序抱怨错误,它期望命名空间' http://schemas.datacontract.org/2004/07 '中的元素,但在' http:// myNamespace '中找到了元素.

问题:为什么不DataContractSerializer使用在SomeMethodResponseType上声明的命名空间XmlTypeAttribute(Namespace="http://myNamespace")

我可以通过显式提供DataContractSerializer构造函数的命名空间和根元素来解决这个问题.但它失败的消息类似于:

行X位置Y(XMLdocument的最后一行)出错.'EndElement''
命名空间'httpmyNapespace'中的SomeMethodResponse不是预期的.期待元素'someNameField'.

SomeName是Web服务正在使用的XSD中的元素.它也是该SomeMethodResponse类型的属性,由称为的私有字段支持someNameField.看起来DataContractSerializer除了属性之外还试图反序列化字段.

如何取消已从磁盘保存的XML并取回SomeMethod返回的相同类型的对象?

谢谢,马特拉

mar*_*c_s 5

您的XML响应显然具有XML命名空间:

<SomeMethodResponse xmlns="http://myNamespace">
    <SomeMember1>value</SomeMember1>
</SomeMethodResponse xmlns="http://myNamespace">
Run Code Online (Sandbox Code Playgroud)

所以为了正确读取和反序列化,你需要告诉你的DataContractSerializer这个命名空间:

DataContractSerializer dcs = 
    new DataContractSerializer(typeof(SomeMethodResponse),
                               "SomeMethodResponse", "http://myNamespace")
Run Code Online (Sandbox Code Playgroud)

通过在构造函数中指定此默认XML命名空间,它应该能够立即读取和反序列化此XML.

你得到的另一个错误:

行X位置Y(XMLdocument的最后一行)出错.'EndElement''命名空间'httpmyNapespace'中的SomeMethodResponse不是预期的.期待元素'someNameField'.

是由非常不寻常的,从未见过的事实导致你的end元素有一个命名空间........

</SomeMethodResponse xmlns="http://myNamespace">
Run Code Online (Sandbox Code Playgroud)

只是删除多余的不必要的命名空间,你应该没事!

</SomeMethodResponse>
Run Code Online (Sandbox Code Playgroud)


mat*_*tra 5

让我来回答我的问题:第二个错误mesasge的原因是实际的SvcUtil工具默默地选择使用XmlSerializer的insted的DataContractSerializer.我通过阅读帮助找到了这一点XmlTypeAttribute- MSDn状态控制XmlSerializer序列化属性目标时生成的XML模式.;-)所以我们又回到了老,XmlSerializer