最近我向 DataContract 添加了一个新属性,这破坏了 Java 客户端的 API,因为反序列化器无法识别新添加的属性。
这个问题的解决方案显然是在新属性上设置 order 属性,以便它出现在 SOAP 消息的最后,然后反序列化器将忽略它。
问题在于,这个新属性存在于基类中,而 WCF 总是首先序列化基类属性,因此无论 order 属性如何,派生类属性总是会随后出现。
我能想到的唯一两种解决此问题的方法是:
第一个解决方案是最糟糕的,但也是最简单的。第二个更困难、风险更大,但也是最好的。
还有其他方法可以处理这种情况吗?是否可以强制默认的 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 更新而递增)。
更新:
尽管我能够让该元素最后出现在 SOAP 消息中,但对于我们的一些使用 Axis2 的客户来说,这仍然是一个重大更改,并且它无法优雅地处理新的无法识别的属性的反序列化,即使它出现最后的。相关SO问题这里.
无法更改订购顺序。 根据您的代码,您可以尝试使属性抽象。这样您可能不需要将所有内容都移至基类。