这取决于您如何设置数据合同。
在 WCF 中,使用所有默认值,您的服务将使用 DataContractSerializer (DCS) 将您的对象序列化为 XML。 DCS 将按顺序序列化您的字段 - 首先是公共字段,然后是私有字段。在每个可见性组中,它将按名称的字母顺序对字段/属性进行排序。
因此,如果您引入一个新的公共属性 MiddleName 并且您已经拥有 FirstName 和 LastName,那么您会很好:旧的 XML 会是
<YourObject>
....
<FirstName>.....</FirstName>
<LastName>.....</LastName>
</YourObject>
而您的新属性只需在末尾添加一个新属性:
<YourObject>
....
<FirstName>.....</FirstName>
<LastName>.....</LastName>
<MiddleName>....</MiddleName>
</YourObject>
这样的更新“在末尾添加一些东西”应该可以正常工作,DCS 只会忽略 XML 中的其他标签。
但是:您是否引入了一个名为 Gender 的属性,该属性会卡在 在 <FirstName> 和 <LastName> 之间,从而破坏 XML 中数据的顺序,从而破坏数据合同 - 没有“旧”客户端能够调用您的新服务。
为了控制这一点,您可以将特定的Order= 属性放在数据合同中的数据成员上:
[DataContract]
public class SomeAddress
{
[DataMember(Order=0)]
public string FirstName;
[DataMember(Order=1)]
public string LastName;
}
然后您可以轻松添加新属性 - 只需将其添加到列表末尾!
[DataContract]
public class SomeAddress
{
[DataMember(Order=0)]
public string FirstName;
[DataMember(Order=1)]
public string LastName;
[DataMember(Order=2)]
public string Gender;
}
因此,通过在数据协定上使用Order= 属性,您可以控制您的 XML 布局,并且可以对现有数据协定进行简单的扩展而不会中断更新。
要了解更多背景知识和深入的专业知识,您应该阅读 MSDN 杂志网站上的Serialization in Windows Communication Foundation - 强烈推荐。