2014-03-04 36 views
1

最近,我向DataContract添加了一个新属性,该属性打破了我们的Java客户端的API,因为反序列化器无法识别新添加的属性。WCF序列化订单问题

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

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

只有2种方式我能想到的解决这个问题是:

  1. 复制的属性和它的所有逻辑到每一个派生类
  2. 写自定义序列,将订购的东西“全球”

第一种解决方案是最糟糕的,但最简单的。其次是困难和风险更大,但最好。

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

谢谢!

回答

2

现在我已经用第一种解决方案,通过简单地将基本属性内部化,并用“new”关键字将它隐藏在派生类中,现在它出现在SOAP消息的末尾。我还没有与客户进行过测试,但一旦有了,我会更新。

基类:

internal bool? MyNewProperty 
{ 
    get; 
    set; 
} 

派生类:

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

如果我们想要增加另一个新的属性,应该是向后兼容的,订单属性应设置为3(最佳实践随着每个API更新而增加)。

UPDATE:
即使我能得到的元素最后出现在SOAP消息中,它仍然是我们的一些客户是谁使用Axis2的重大更改,它不能处理反序列化新的无法识别的属性优雅,即使它最后出现。相关SO问题here

0

无法更改排序顺序。 根据您的代码,您可以尝试使属性摘要。这样你可能不需要把所有东西都移到基类中。

+0

我试图做到这一点,然后重写所有派生类中的属性,但派生类型仍然出现在新属性之后。 –

+0

@ShahinDohan真的吗?即使您在派生类中设置了[DataMember]标签? – David

+0

重写序列化程序显然并不困难。我想那是最麻烦的选择。请参阅:http://www.codeproject.com/Articles/434665/WCF-Serialization-A-Case-Study – David