上位互換性のあるデータ コントラクトForward-Compatible Data Contracts

機能の Windows Communication Foundation (WCF) データ コントラクト システムがコントラクトは、互換性に影響しない方法で時間の経過と共に進化できます。A feature of the Windows Communication Foundation (WCF) data contract system is that contracts can evolve over time in nonbreaking ways. つまり、古いバージョンのデータ コントラクトを使用するクライアントが同じデータ コントラクトの新しいバージョンのサービスと通信したり、新しいバージョンのデータ コントラクトを使用するクライアントが同じデータ コントラクトの古いバージョンと通信したりできます。That is, a client with an older version of a data contract can communicate with a service with a newer version of the same data contract, or a client with a newer version of a data contract can communicate with an older version of the same data contract. 詳細については、次を参照してください。ベスト プラクティス。データ コントラクトのバージョン管理します。For more information, see Best Practices: Data Contract Versioning.

バージョン管理機能の大半は、既存のデータ コントラクトの新しいバージョンが作成されたときに、必要に応じて適用できます。You can apply most of the versioning features on an as-needed basis when new versions of an existing data contract are created. ただし、1 つのバージョン管理機能、ラウンド トリップ、適切に機能するために最初のバージョンから型を構築する必要があります。However, one versioning feature, round-tripping, must be built into the type from the first version in order to work properly.

ラウンド トリップRound-Tripping

ラウンド トリップは、データ コントラクトの新しいバージョンから古いバージョンにデータが渡され、新しいバージョンに戻されるときに発生します。Round-tripping occurs when data passes from a new version to an old version and back to the new version of a data contract. ラウンド トリップでは、データの損失がないことが保証されます。Round-tripping guarantees that no data is lost. ラウンド トリップを有効にすると、データ コントラクト バージョン管理モデルによってサポートされる将来の変更に関して、型の上位互換性が保たれます。Enabling round-tripping makes the type forward-compatible with any future changes supported by the data contract versioning model.

特定の型のラウンド トリップを有効にするには、この型に IExtensibleDataObject インターフェイスを実装する必要があります。To enable round-tripping for a particular type, the type must implement the IExtensibleDataObject interface. このインターフェイスには、(ExtensionData 型を返す) ExtensionDataObject プロパティが含まれます。The interface contains one property, ExtensionData (returning the ExtensionDataObject type). このプロパティにより、現在のバージョンでは未知の、今後使用されるデータ コントラクトの任意のデータが格納されます。The property stores any data from future versions of the data contract that is unknown to the current version.

Example

次のデータ コントラクトは、将来の変更に対して上位互換性がありません。The following data contract is not forward-compatible with future changes.

[DataContract]
public class Person
{
    [DataMember]
    public string fullName;
}
<DataContract()>  _
Public Class Person
    <DataMember()>  _
    Public fullName As String
End Class 

将来の変更 (たとえば、"phoneNumber" という名前の新しいデータ メンバーを追加する) に対して互換性を確保するには、IExtensibleDataObject インターフェイスを次のように実装します。To make the type compatible with future changes (such as adding a new data member named "phoneNumber"), implement the IExtensibleDataObject interface.

[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 インフラストラクチャには、元のデータ コントラクトの一部でないデータが検出されると、データが、プロパティに格納されているし、保持されます。When the WCF infrastructure encounters data that is not part of the original data contract, the data is stored in the property and preserved. データは一時的に格納されるだけで、処理されることはありません。It is not processed in any other way except for temporary storage. オブジェクトを発生元に返すと、元の (未知の) データも返されます。If the object is returned back to where it originated, the original (unknown) data is also returned. したがって、データが失われることなく、元のエンドポイントとの間でラウンド トリップ (往復) が行われます。Therefore, the data has made a round trip to and from the originating endpoint without loss. ただし、発生元のエンドポイントでデータを処理する必要がある場合、この要求は満たされないため、このエンドポイントでは何らかの方法で変更を検出して対応する必要があることに注意してください。Note, however, that if the originating endpoint required the data to be processed, that expectation is unmet, and the endpoint must somehow detect and accommodate the change.

ExtensionDataObject 型にはパブリックなメソッドやプロパティはありません。The ExtensionDataObject type contains no public methods or properties. そのため、ExtensionData プロパティ内に格納されているデータに直接アクセスすることはできません。Thus, it is impossible to get direct access to the data stored inside the ExtensionData property.

ラウンド トリップ機能は、ignoreExtensionDataObject コンストラクターで trueDataContractSerializer に設定する、または IgnoreExtensionDataObjecttrue プロパティを ServiceBehaviorAttribute に設定することで無効にできます。The round-tripping feature may be turned off, either by setting ignoreExtensionDataObject to true in the DataContractSerializer constructor or by setting the IgnoreExtensionDataObject property to true on the ServiceBehaviorAttribute. この機能を無効にすると、デシリアライザーが ExtensionData プロパティを設定しないため、シリアライザーはプロパティの内容を出力しません。When this feature is off, the deserializer will not populate the ExtensionData property, and the serializer will not emit the contents of the property.

関連項目See also