我正在使用调用Web服务并在客户端使用WCF生成的服务参考。 我已将从测试服务接收到的不带SOAP信封和正文标记的XML响应保存到磁盘中。我想从磁盘加载它们并从中创建对象。让我们看看来自我的Web服务的以下方法:
SomeMethodResponse SomeMethod(SomeMethodRequest req)
我手动(通过SOAP UI)将响应保存到磁盘文件中,示例响应:
<SomeMethodResponse xmlns="http://myNamespace">
<SomeMember1>value</SomeMember1>
</SomeMethodResponse>
然后我尝试使用以下方式从文件中反序列化对象:
DataContractSerializer dcs =
new DataContractSerializer(typeof(SomeMethodResponse))
这个失败了——序列化器报错,它期望在命名空间为 'http://schemas.datacontract.org/2004/07' 的元素中找到了在 'http://myNamespace' 中的元素。
问题: 为什么DataContractSerializer
不使用在 SomeMethodResponseType
上声明的命名空间: XmlTypeAttribute(Namespace="http://myNamespace")
?
我可以通过在DataContractSerializer
构造函数中显式提供命名空间和根元素来解决这个问题。但是,然后会出现类似下面的错误信息:
XML文档的最后一行出现错误,在 X 行 Y 列 'EndElement' 命名空间'httpmyNapespace' 中的'SomeMethodResponse 不应该出现。 期望元素'someNameField'。
SomeName
是 web 服务使用的 XSD 中的一个元素。它也是 SomeMethodResponse
类型的属性,由名为 someNameField
的私有字段支持。看起来 DataContractSerializer
正试图反序列化字段以及属性。
如何反序列化我从磁盘保存的 XML 并获得与 SomeMethod 返回相同类型的对象?
谢谢, Matra