【问题标题】:WCF serialization order issueWCF序列化顺序问题
【发布时间】:2014-03-04 14:13:01
【问题描述】:

最近我向 DataContract 添加了一个新属性,这破坏了我们的 Java 客户端的 API,因为反序列化器无法识别新添加的属性。

解决方案显然是在新属性上设置 order 属性,以便它出现在 SOAP 消息中的最后,然后反序列化器将简单地忽略它。

问题是这个新属性存在于基类中,而WCF总是先序列化基类属性,所以无论order属性如何,派生类属性总是会在后面出现。

我能想到的解决此问题的唯一两种方法是:

  1. 将属性及其所有逻辑复制到每个派生类
  2. 编写一个自定义序列化程序,可以“全局”排序

第一个解决方案是最糟糕的,但也是最简单的。第二个难度更大,风险更大,但最好。

我还有其他方法可以处理这种情况吗?是否可以强制默认 WCF 序列化程序以不同方式处理排序?

谢谢!

【问题讨论】:

    标签: c# .net wcf api serialization


    【解决方案1】:

    现在我采用了第一个解决方案,只需将基本属性设置为内部属性,并使用“new”关键字将其隐藏在派生类中,现在它出现在 SOAP 消息的末尾。我还没有在客户端上测试过这个,但是一旦我测试了就会在这里更新。

    基类:

    internal bool? MyNewProperty
    {
        get;
        set;
    }
    

    派生类:

    [DataMember(Order = 2)]
    public new bool? MyNewProperty
    {
        get { return base.MyNewProperty; }
        set { base.MyNewProperty= value; }
    }
    

    如果我们想添加另一个应该向后兼容的新属性,Order 属性应该设置为 3(最佳做法是随着每次 API 更新而递增)。

    更新:
    尽管我能够让元素最后出现在 SOAP 消息中,但对于我们的一些使用 Axis2 的客户来说,这仍然是一个重大更改,并且它不能优雅地处理反序列化新的无法识别的属性,即使它出现了最后的。相关 SO 问题here

    【讨论】:

      【解决方案2】:

      无法更改排序顺序。 根据您的代码,您可以尝试使属性抽象。这样,您可能不需要将所有内容都移至基类。

      【讨论】:

      • 我尝试这样做,然后覆盖所有派生类中的属性,但派生类型仍然出现在新属性之后。
      • @ShahinDohan 真的吗?即使在派生类中设置了[DataMember]标签?
      • 覆盖序列化器显然并不难。我想那是最不混乱的选择。见:codeproject.com/Articles/434665/WCF-Serialization-A-Case-Study
      • 抽象不起作用,但在派生类中用“new”隐藏基属性就可以了!
      • @ShahinDohan 啊当然! :) 你真聪明。也许让它成为一个新的答案并重新表述你的问题,这样未来遇到这个问题的程序员会找到你的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 2012-02-19
      相关资源
      最近更新 更多