データ コントラクトの等価性

クライアントがサービスに特定の型のデータを正常に送信するために、またはサービスがクライアントにデータを正常に送信するために、送信する型が受信側に存在する必要があるとは限りません。両方の型のデータ コントラクトが同等であるということが唯一の要件です(データ コントラクトのバージョン管理 で説明されているように、厳密な同等が必要ない場合もあります)。

データ コントラクトを同等にするには、そのデータ コントラクトに同じ名前空間と名前を使用する必要があります。また、一方のデータ コントラクトの各データ メンバには、他方のデータ コントラクトに同等のデータ メンバがある必要があります。

データ メンバを同等にするには、そのデータ メンバに同じ名前を使用する必要があります。さらに、データ メンバは同じ型のデータを表す必要があります。つまり、データ コントラクトが同等である必要があります。

ms734767.note(ja-jp,VS.90).gifメモ :
データ コントラクト名と名前空間、およびデータ メンバ名は、大文字と小文字を区別します。

データ コントラクト名と名前空間、およびデータ メンバ名詳細については、 、「データ コントラクト名」を参照してください。

2 つの型が両側 (送信者と受信者) に存在し、そのデータ コントラクトが同等でない場合 (たとえば、異なるデータ メンバを含んでいる場合)、そのデータ コントラクトに同じ名前と名前空間を使用しないでください。同じ名前と名前空間を使用すると、例外がスローされる可能性があります。

次の型のデータ コントラクトは同等です。

データ メンバの順序とデータ コントラクトの等価性

DataMemberAttribute クラスの Order プロパティの使用は、データ コントラクトの等価性に影響を与えることがあります。データ コントラクトを同等にするには、データ メンバが同じ順序で現れる必要があります。既定の順序はアルファベット順です。詳細な情報については、次のページを参照してください。 「データ メンバの順序」を参照してください。

たとえば、次のコードでは、同等なデータ コントラクトが生成されます。

次のコードでは、同等なデータ コントラクトは生成されません。

継承、インターフェイス、およびデータ コントラクトの等価性

等価性を判断するとき、別のデータ コントラクトから継承したデータ コントラクトは、基本型のすべてのデータ メンバを含んでいる 1 つのデータ コントラクトとして扱われます。データ メンバの順序が一致する必要があり、基本型のメンバは派生型のメンバより前に現れる必要があります。さらに、次のコード例のように、2 つのデータ メンバの順序の値が同じ場合、そのデータ メンバの順序はアルファベット順になります。詳細な情報については、次のページを参照してください。 「データ メンバの順序」を参照してください。

次の例では、型 Employee のデータ コントラクトは型 Worker のデータ コントラクトと同等です。

クライアントとサービスの間でパラメータを渡し、値を返すとき、受信エンドポイントが派生クラスからのデータ コントラクトを予期している場合、基本クラスからのデータ コントラクトを送信できません。これは、オブジェクト指向プログラミングの原則に基づいています。前の例では、Employee が予期される場合、型 Person のオブジェクトを送信できません。

基本クラスからのデータ コントラクトが予期されるときに派生クラスからのデータ コントラクトを送信することは可能ですが、受信エンドポイントが KnownTypeAttribute を使用して派生型を認識している場合に限ります。詳細な情報については、次のページを参照してください。 「既知のデータ コントラクト型」を参照してください。上記の例では、Person が予期されるときに、受信者のコードが既知の型のリストに Employee を追加するために KnownTypeAttribute を使用している場合のみ、型 Employee のオブジェクトを送信できます。

アプリケーション間でパラメータを渡し、値を返すとき、予期される型がインターフェイスの場合、その型は、型が Object の予期される型と同等です。すべての型は最終的に Object から派生するので、すべてのデータ コントラクトは最終的に、Object のデータ コントラクトから派生します。したがって、インターフェイスが予期されるとき、すべてのデータ コントラクト型を渡すことができます。インターフェイスを正常に操作するには追加の手順が必要です。詳細については、「既知のデータ コントラクト型」を参照してください。

関連項目

リファレンス

DataContractAttribute
DataMemberAttribute

概念

データ メンバの順序
既知のデータ コントラクト型
データ コントラクト名