WCF序列化顺序问题

问题描述 投票:0回答:2

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

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

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

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

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

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

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

c# .net wcf serialization
2个回答
2
投票

现在我采用了第一个解决方案,只需将基本属性设为内部属性,并使用“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问题这里.


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.