Windows Communication Foundation (WCF) データ コントラクト システムの機能は、コントラクトが時間の経過と同時に、壊れない方法で進化する可能性があるということです。 つまり、データ コントラクトの古いバージョンのクライアントは、同じデータ コントラクトの新しいバージョンでサービスと通信できます。または、データ コントラクトの新しいバージョンを持つクライアントは、同じデータ コントラクトの古いバージョンと通信できます。 詳細については、「 ベスト プラクティス: データ コントラクトのバージョン管理」を参照してください。
既存のデータ コントラクトの新しいバージョンが作成されるときに、必要に応じてほとんどのバージョン管理機能を適用できます。 ただし、適切に動作させるには、1 つのバージョン管理機能である ラウンドトリップを最初のバージョンの型に組み込む必要があります。
Round-Tripping
ラウンドトリップは、データが新しいバージョンから古いバージョンに渡され、データ コントラクトの新しいバージョンに戻るときに発生します。 ラウンドトリップでは、データが失われないことが保証されます。 ラウンドトリップを有効にすると、データ コントラクトのバージョン管理モデルでサポートされる将来の変更と型の互換性が前方に調整されます。
特定の型に対してラウンドトリップを有効にするには、型で IExtensibleDataObject インターフェイスを実装する必要があります。 インターフェイスには、(ExtensionDataObject型を返す) ExtensionData 1 つのプロパティが含まれています。 このプロパティは、現在のバージョンに不明なデータ コントラクトの将来のバージョンのデータを格納します。
例
次のデータ コントラクトは、将来の変更と前方互換性がありません。
[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
をDataContractSerializerコンストラクターでtrue
に設定するか、ServiceBehaviorAttributeでIgnoreExtensionDataObjectプロパティをtrue
に設定することでオフにすることができます。 この機能がオフの場合、デシリアライザーは ExtensionData プロパティを設定せず、シリアライザーはプロパティの内容を出力しません。