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返回的相同类型的对象?
谢谢,马特拉
您的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)
让我来回答我的问题:第二个错误mesasge的原因是实际的SvcUtil工具默默地选择使用XmlSerializer的insted的DataContractSerializer.我通过阅读帮助找到了这一点XmlTypeAttribute- MSDn状态控制XmlSerializer序列化属性目标时生成的XML模式.;-)所以我们又回到了老,XmlSerializer
| 归档时间: |
|
| 查看次数: |
10596 次 |
| 最近记录: |