【问题标题】:How to ignore UnknownElements on deserialization (XmlSerializer) by using a WCF SoapClient?如何使用 WCF SoapClient 在反序列化(XmlSerializer)上忽略 UnknownElements?
【发布时间】:2014-04-13 11:26:03
【问题描述】:

我有一个 C# 项目,我在其中通过 WSDL 文件添加了 WCF 服务引用。因为我不想使用“DataContractSerializer”,所以我更改了“Reference.svcmap”并将Serializer 设置为“XmlSerializer”。此时一切正常。

现在解决问题。服务不是我的服务,它可以是,服务的程序员向结果类添加属性,我不能同时更新我的​​参考。因此,我导入的 WSDL 可能已过时。这种情况下反序列化后的结果是不正确的。

例如,结果具有“名称”、“街道”和“城镇”属性。如果服务现在返回...

<?xml version="1.0" encoding="UTF-8"?>
  <TestResult xmlns="http://test.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Name>Tim</Name>
  <Street>Samplestreet</Street>
  <Town>Sampletown</Town>
</TestResult>

我的结果具有以下值:

姓名=蒂姆
街道=Samplestreet
Town=Sampletown

如果服务程序员现在在“Name”和“Street”之间添加属性“Fullname”并且我的 WSDL 导入已过期,则结果将变得不正确。服务返回...

<?xml version="1.0" encoding="UTF-8"?>
  <TestResult xmlns="http://test.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Name>Tim</Name>
  <FullName>Tim Brown</FullName>
  <Street>Samplestreet</Street>
  <Town>Sampletown</Town>
</TestResult>

但反序列化后我的结果有值:

姓名=蒂姆
街道=空
城镇=null

看起来 WCF 的 XmlSerialzier 在无异常发现 UnknownElement 时停止反序列化。

问题,是否有设置、配置服务引用的方法、SoapClient 或 Serializier 以忽略 UnknownElement 并像标准 XmlSerialzier 一样继续反序列化如何返回它知道的所有值?

或者有没有办法在 WCF SoapClient 的客户端使用自己的 Serialzier?

【问题讨论】:

    标签: c# web-services wcf wsdl xml-serialization


    【解决方案1】:

    由于“Legart”的答案,我查看了生成的文件“Reference.cs”并找出为什么我得到错误的反序列化结果,当服务向我发送结果时我的服务参考未知的新元素。

    问题是在生成的参考文件中,“XmlElementArributes”有一个名为“Order”的参数。如果服务现在向我发送了一个新的未知元素,它可能是,该元素会更改元素的顺序,然后反序列化将返回错误的结果。

    我目前的解决方案是删除属性中的所有“订单”参数。那么 Server 结果中改变的顺序和添加的元素对反序列化没有影响。就像新的未知元素将被忽略。

    这不是最好的解决方案,因为我必须编辑生成的文件,但目前它对我有用。

    如果你知道更好的方法,请写评论。

    【讨论】:

    • 是的,编辑 reference.cs 不是最好的方法。服务器端有订单属性吗?
    • 我不知道,因为我不是服务器端的程序员。这就是为什么我寻找一种方法,如果服务器端有小的变化,我的客户端程序不会出现大问题。例如一些更改,即更改元素顺序。目前我的解决方案对我有用;)
    【解决方案2】:

    您可以尝试向您的类 TestResult 添加其他属性并用 XmlAnyElement 标记它:

    [XmlAnyElement]
    public XmlElement[] AllElements;
    

    XmlAnyElement

    对于 DataContract,DataMember 样式可以实现 IExtensibleDataObject 接口:

    IExtensibleDataObject

    【讨论】:

    • 感谢您的回答。不幸的是,这不是我的问题的解决方案,但它帮助我找到了导致我成为错误序列化结果的真正问题。更多信息,请参阅我的答案。
    猜你喜欢
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多