Windows Communication Foundation (WCF) 數據合約系統的一項功能是,合約可以隨著時間以不間斷的方式演進。 也就是說,具有舊版數據合約的用戶端可以與相同數據合約的較新版本的服務通訊,或是具有較新版本數據合約的用戶端可以與舊版相同數據合約通訊。 如需詳細資訊,請參閱 最佳做法:數據合約版本控制。
建立新版本的現有數據合約時,您可以視需要套用大部分的版本控制功能。 不過,一個版本控制功能「回返」,必須從第一個版本起就在類型中內建,才會正常運作。
Round-Tripping
當數據從新版本傳遞至舊版本,然後再回到新版本的數據合同時,就會發生回傳。 來回行程保證不會遺失任何數據。 啟用往返存取可使類別能夠與數據契約版本化模型所支援的任何未來變更向前相容。
若要啟用特定類型的回圈處理,該類型必須實作 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 屬性,而且串行化程式不會發出屬性的內容。