Windows Communication Foundation(WCF)数据协定系统的一项功能是,协定可以以不破坏的方式随时间推移而不断演变。 也就是说,具有较旧版本数据协定的客户端可以与同一数据协定的较新版本的服务通信,或者具有较新版本的数据协定的客户端可以与旧版相同数据协定进行通信。 有关详细信息,请参阅 最佳做法:数据协定版本控制。
创建新版本的现有数据协定时,可以根据需要应用大多数版本控制功能。 但是为了能正常工作,第一版的类型中必须内置一种称为“往返”的版本管理功能。
往返
当数据从新版本传递到旧版本并返回到数据协定的新版本时,会发生往返。 往返保证了数据不会丢失。 如果启用往返功能,则可以使类型向前兼容于数据协定版本管理模型所支持的任何未来更改。
若要对某一特定类型启用往返功能,该类型必须实现 IExtensibleDataObject 接口。 接口包含一个属性( ExtensionData 返回 ExtensionDataObject 类型)。 该属性存储当前版本未知的数据协定的未来版本中的任何数据。
示例:
以下数据协定与将来的更改不兼容。
[DataContract]
public class Person
{
[DataMember]
public string fullName;
}
<DataContract()> _
Public Class Person
<DataMember()> _
Public fullName As String
End Class
若要使类型与将来的更改(例如添加新的数据成员“phoneNumber”)兼容,请实现 IExtensibleDataObject 该接口。
[DataContract]
public class Person : IExtensibleDataObject
{
[DataMember]
public string fullName;
private ExtensionDataObject theData;
public virtual ExtensionDataObject ExtensionData
{
get { return theData; }
set { theData = value; }
}
}
<DataContract()> _
Public Class Person
Implements IExtensibleDataObject
<DataMember()> _
Public fullName As String
Private theData As ExtensionDataObject
Public Overridable Property ExtensionData() As _
ExtensionDataObject Implements _
IExtensibleDataObject.ExtensionData
Get
Return theData
End Get
Set
theData = value
End Set
End Property
End Class
当 WCF 基础结构遇到不属于原始数据协定的数据时,数据存储在属性中并保留。 除了临时存储之外,它不会以任何其他方式进行处理。 如果对象返回回其发起位置,则也会返回原始(未知)数据。 由此,数据完成了从起始终结点又回到起始终结点的往返过程而没有丢失。 但是,请注意,如果原始终结点要求数据已经被处理,则该预期未被满足,原始终结点必须找到方法检测并适应变化。
该 ExtensionDataObject 类型不包含公共方法或属性。 因此,无法直接访问存储在属性中的数据 ExtensionData 。
可以通过在ignoreExtensionDataObject
构造函数中将true
设置为DataContractSerializer,或者在IgnoreExtensionDataObject上将true
属性设置为ServiceBehaviorAttribute,来关闭往返功能。 当此功能关闭时,反序列化程序不会填充 ExtensionData 该属性,序列化程序将不会发出该属性的内容。