WCF序列化顺序问题



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

显然,解决方案是在新属性上设置order属性,使其在SOAP消息中最后出现,然后反序列化程序将忽略它。

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

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

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

第一种解决方案是最糟糕的,但也是最简单的。第二个要困难得多,风险也大得多,但却是最好的。

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

谢谢!

现在我已经使用了第一个解决方案,只需将基本属性设置为内部属性,并使用"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更新时递增的最佳实践)。

UPDATE:
即使我能够让元素最后出现在SOAP消息中,但对于我们使用Axis2的一些客户端来说,这仍然是一个突破性的更改,而且它不能很好地反序列化新的无法识别的属性,即使它最后出现。此处有相关SO问题。

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

最新更新