我在客户端看到以下场景的序列化问题。
假设我们的服务代码中有以下类和方法
[DataContract]
public class Derived
{
[DataMember]
public string A { get; set; }
[DataMember]
public string B { get; set; }
[DataMember]
public string C { get; set; }
[DataMember]
public string D { get; set; }
}
并且服务接口有方法
[OperationContract]
Derived GetDerived();
方法的实现——
public Derived GetDerived()
{
var d = new Derived() {A = "A", B = "B", C = "C", D = "D"};
return d;
}
对于这个 WCF 服务,如果我创建客户端代理(通过添加服务引用)并执行 GetDerived() 调用,一切正常。
让我们稍微改变一下服务代码中的实体
[DataContract]
public class Base
{
[DataMember]
public string B { get; set; }
}
[DataContract]
public class Derived : Base
{
[DataMember]
public string A { get; set; }
[DataMember]
public string C { get; set; }
[DataMember]
public string D { get; set; }
}
所以在这种情况下,我创建了一个新的基类并将属性“B”移动到基类。在客户端使用相同的旧代理,如果我调用 GetDerived,我看不到在客户端正确序列化的 A 的值。但是,先前版本和当前版本的 SOAP 消息是相同的(仅更改了顺序)。我遇到了这篇解释排序的http://msdn.microsoft.com/en-us/library/ms729813.aspx文章。由于我将“B”移至基类,因此无论如何我看不到控制它在派生类中的顺序。
这个问题有什么解决方法吗?这破坏了对客户端的向后兼容性。
另一方面,如果我将新属性(例如 C1)添加到派生类(或任何现有类),它也会更改顺序。为什么这不会破坏客户端?与我之前提到的场景相比。