Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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# DataContractSerializer和反序列化web服务响应类型_C#_Wcf_Web Services_Datacontractserializer - Fatal编程技术网

C# DataContractSerializer和反序列化web服务响应类型

C# DataContractSerializer和反序列化web服务响应类型,c#,wcf,web-services,datacontractserializer,C#,Wcf,Web Services,Datacontractserializer,我在客户端上使用调用web服务和使用WCF生成的服务引用。我已经将从测试服务接收的XML响应保存到磁盘(没有SOAP信封和正文标记),我想从磁盘加载它们并从中创建对象。让我们从我的web服务中获取以下方法: SomeMethodResponse SomeMethod(SomeMethodRequest req) 我手动(通过SOAP UI)将响应保存到磁盘到文件,示例响应: <SomeMethodResponse xmlns="http://myNamespace"> &l

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

SomeMethodResponse SomeMethod(SomeMethodRequest req)
我手动(通过SOAP UI)将响应保存到磁盘到文件,示例响应:

<SomeMethodResponse xmlns="http://myNamespace">
    <SomeMember1>value</SomeMember1>
</SomeMethodResponse>
此操作失败–序列化程序报告错误,它在命名空间“”中需要元素,但在“”中找到元素

问题:为什么
DataContractSerializer
不使用命名空间,该命名空间是在SomeMethodResponseType上用
XmlTypeAttribute声明的(命名空间=”http://myNamespace”

我可以通过显式地向
DataContractSerializer
构造函数提供名称空间和根元素来解决这个问题。但是它失败了,消息类似于:

第X行位置Y(XMLdocument的最后一行)出错。'EndElement“”SomeMethodResponse
不应来自命名空间“httpmyNapespace”。 应为元素“someNameField”

SomeName
是web服务正在使用的XSD中的一个元素。它也是
SomeMethodResponse
类型的属性,由名为
someNameField
的私有字段支持。看起来,
DataContractSerializer
正在尝试除属性外反序列化字段

如何反序列化从磁盘保存的XML,并返回SomeMethod返回的相同类型的对象

谢谢,
Matra

您的XML响应显然有一个XML名称空间:

<SomeMethodResponse xmlns="http://myNamespace">
    <SomeMember1>value</SomeMember1>
</SomeMethodResponse xmlns="http://myNamespace">
DataContractSerializer dcs = 
    new DataContractSerializer(typeof(SomeMethodResponse),
                               "SomeMethodResponse", "http://myNamespace")
通过在构造函数中指定此默认XML命名空间,它现在应该能够读取和反序列化此XML

您遇到的另一个错误是:

第X行位置Y(XMLdocument的最后一行)出错。'恩德莱恩' 不应使用命名空间“httpmyNapespace”中的“SomeMethodResponse”。 应为元素“someNameField”

是由一个非常不寻常且从未见过的事实引起的,即您的结束元素上有一个名称空间

</SomeMethodResponse xmlns="http://myNamespace">

只要删除那个多余的不必要的名称空间,就可以了

</SomeMethodResponse>


让我回答我自己的问题:第二个错误的原因是,实际上,svcUtil选择使用
XmlSerializer
而不是
DataContractSerializer
。通过阅读
XmlTypeAttribute
的帮助,我发现了这一点——MSDn状态控制由XmlSerializer序列化属性目标时生成的XML模式所以我们回到了旧的,
XmlSerializer

Marc。谢谢你的回答。然而,这不是问题。正如下面所写的,我已经尝试过“通过显式地向DataContractSerializer构造函数提供名称空间和根元素来解决这个问题。”。结束元素名称空间是一个复制粘贴错误(在发布问题之前,我手工生成了simpel XML)-它不存在于真正的XML中。@Matra:好的,那么问题出在哪里??…但是当名称空间在SomeMethodResponse类的DataContractAttribute的namespace属性中定义时,为什么我们必须指定它呢?你有没有设法不使用你所说的变通方法?
</SomeMethodResponse>