向前相容資料合約
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 屬性,而且序列化程式將不會發出屬性內容。