データ コントラクトの等価性
クライアントがサービスに特定の型のデータを正常に送信するために、またはサービスがクライアントにデータを正常に送信するために、送信する型が受信側に存在する必要があるとは限りません。両方の型のデータ コントラクトが同等であるということが唯一の要件です(データ コントラクトのバージョン管理 で説明されているように、厳密な同等が必要ない場合もあります)。
データ コントラクトを同等にするには、そのデータ コントラクトに同じ名前空間と名前を使用する必要があります。また、一方のデータ コントラクトの各データ メンバには、他方のデータ コントラクトに同等のデータ メンバがある必要があります。
データ メンバを同等にするには、そのデータ メンバに同じ名前を使用する必要があります。さらに、データ メンバは同じ型のデータを表す必要があります。つまり、データ コントラクトが同等である必要があります。
メモ : |
---|
データ コントラクト名と名前空間、およびデータ メンバ名は、大文字と小文字を区別します。 |
データ コントラクト名と名前空間、およびデータ メンバ名詳細については、 、「データ コントラクト名」を参照してください。
2 つの型が両側 (送信者と受信者) に存在し、そのデータ コントラクトが同等でない場合 (たとえば、異なるデータ メンバを含んでいる場合)、そのデータ コントラクトに同じ名前と名前空間を使用しないでください。同じ名前と名前空間を使用すると、例外がスローされる可能性があります。
次の型のデータ コントラクトは同等です。
データ メンバの順序とデータ コントラクトの等価性
DataMemberAttribute クラスの Order プロパティの使用は、データ コントラクトの等価性に影響を与えることがあります。データ コントラクトを同等にするには、データ メンバが同じ順序で現れる必要があります。既定の順序はアルファベット順です。詳細な情報については、次のページを参照してください。 「データ メンバの順序」を参照してください。
たとえば、次のコードでは、同等なデータ コントラクトが生成されます。
次のコードでは、同等なデータ コントラクトは生成されません。
継承、インターフェイス、およびデータ コントラクトの等価性
等価性を判断するとき、別のデータ コントラクトから継承したデータ コントラクトは、基本型のすべてのデータ メンバを含んでいる 1 つのデータ コントラクトとして扱われます。データ メンバの順序が一致する必要があり、基本型のメンバは派生型のメンバより前に現れる必要があります。さらに、次のコード例のように、2 つのデータ メンバの順序の値が同じ場合、そのデータ メンバの順序はアルファベット順になります。詳細な情報については、次のページを参照してください。 「データ メンバの順序」を参照してください。
次の例では、型 Employee
のデータ コントラクトは型 Worker
のデータ コントラクトと同等です。
クライアントとサービスの間でパラメータを渡し、値を返すとき、受信エンドポイントが派生クラスからのデータ コントラクトを予期している場合、基本クラスからのデータ コントラクトを送信できません。これは、オブジェクト指向プログラミングの原則に基づいています。前の例では、Employee
が予期される場合、型 Person
のオブジェクトを送信できません。
基本クラスからのデータ コントラクトが予期されるときに派生クラスからのデータ コントラクトを送信することは可能ですが、受信エンドポイントが KnownTypeAttribute を使用して派生型を認識している場合に限ります。詳細な情報については、次のページを参照してください。 「既知のデータ コントラクト型」を参照してください。上記の例では、Person
が予期されるときに、受信者のコードが既知の型のリストに Employee
を追加するために KnownTypeAttribute を使用している場合のみ、型 Employee のオブジェクトを送信できます。
アプリケーション間でパラメータを渡し、値を返すとき、予期される型がインターフェイスの場合、その型は、型が Object の予期される型と同等です。すべての型は最終的に Object から派生するので、すべてのデータ コントラクトは最終的に、Object のデータ コントラクトから派生します。したがって、インターフェイスが予期されるとき、すべてのデータ コントラクト型を渡すことができます。インターフェイスを正常に操作するには追加の手順が必要です。詳細については、「既知のデータ コントラクト型」を参照してください。
関連項目
リファレンス
DataContractAttribute
DataMemberAttribute