WCF序列化订单问题

时间:2014-03-04 14:13:01

标签: c# .net wcf api serialization

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

对此的解决方案显然是在新属性上设置order属性,使其在SOAP消息中显示在最后,然后解串器将忽略它。

问题是这个新属性存在于基类中,并且WCF总是首先序列化基类属性,因此无论order属性如何,派生类属性总是会在之后出现。

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

  1. 将属性及其所有逻辑复制到每个派生类
  2. 编写一个可以“全局”命令的自定义序列化程序
  3. 第一种解决方案是最糟糕的,但最简单的。第二是更困难和风险,但最好。

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

    谢谢!

2 个答案:

答案 0 :(得分:2)

现在我已经使用了第一个解决方案,只需将base属性设置为内部,并使用“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

答案 1 :(得分:0)

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