次の方法で共有


データ コントラクト名

クライアントとサービスが同じ型を共有しないことがあります。このような場合でも、双方のデータ コントラクトが等価であれば、相互にデータを受け渡すことができます。データ コントラクトの等価性は、データ コントラクトとデータ メンバの名前に基づいているため、型とメンバを名前にマップするための機構が用意されています。ここでは、データ コントラクトの命名規則に加えて、名前を作成する際の Windows Communication Foundation (WCF) インフラストラクチャの既定の動作についても説明します。

基本的な規則

データ コントラクトの名前付けに関する基本的な規則は次のとおりです。

  • データ コントラクトの完全修飾名は、名前空間と名前から構成されます。
  • データ メンバは名前のみを持ち、名前空間はありません。
  • データ コントラクトを処理するときに、WCF インフラストラクチャは、データ コントラクトの名前空間と名前およびデータ メンバの名前について大文字と小文字を区別します。

データ コントラクト名前空間

データ コントラクトの名前空間は、URI (Uniform Resource Identifier) の形式を使用します。URI は、絶対 URI でも相対 URI のどちらでもかまいません。既定では、特定の型のデータ コントラクトには、その型の共通言語ランタイム (CLR: Common Language Runtime) 名前空間に基づく名前空間が割り当てられます。

既定では、任意の CLR 名前空間 (Clr.Namespace の形式) が、名前空間 "http://schemas.datacontract.org/2004/07/Clr.Namespace" にマップされます。この既定をオーバーライドするには、ContractNamespaceAttribute 属性をモジュールまたはアセンブリ全体に適用します。また、型ごとにデータ コントラクト名前空間を制御するには、DataContractAttributeNamespace プロパティを設定します。

ms731045.note(ja-jp,VS.90).gifメモ :
"https://schemas.microsoft.com/2003/10/Serialization" 名前空間は予約されているため、データ コントラクトの名前空間として使用することはできません。

ms731045.note(ja-jp,VS.90).gifメモ :
delegate 宣言を含むデータ コントラクト型では、既定の名前空間をオーバーライドすることはできません。

データ コントラクト名

ある型のデータ コントラクトの既定の名前は、その型の名前になります。この既定をオーバーライドするには、DataContractAttributeName プロパティを別の名前に設定します。ジェネリック型に関する特別な規則については、このトピックで後述される「ジェネリック型のデータ コントラクト名」で説明します。

データ メンバ名

フィールドまたはプロパティのデータ メンバの既定の名前は、そのフィールドまたはプロパティの名前になります。この既定をオーバーライドするには、DataMemberAttributeName プロパティを別の値に設定します。

次の例では、データ コントラクトおよびデータ メンバの既定の名前付け動作をオーバーライドする方法を示します。

ジェネリック型のデータ コントラクト名

ジェネリック型のデータ コントラクト名を決定する場合は、特別な規則があります。これらの規則は、同じジェネリック型の 2 つのクローズ ジェネリックの間でデータ コントラクト名の競合を回避するのに役立ちます。

既定では、ジェネリック型のデータ コントラクト名は、型の名前の後に文字列 "Of"、ジェネリック パラメータのデータ コントラクト名、ジェネリック パラメータのデータ コントラクト名前空間を使用して計算されたハッシュが続きます。ハッシュとは、1 つのデータを一意に識別するための "指紋" として機能する、数学関数の結果です。ジェネリック パラメータがすべてプリミティブ型の場合は、ハッシュは省略されます。

たとえば、次の例の型を見てください。

この例では、Drawing<Square,RegularRedBrush> 型は "DrawingOfSquareRedBrush5HWGAU6h" というデータ コントラクト名を持ちます。ここで "5HWGAU6h" は "urn:shapes" および "urn:default" 名前空間のハッシュになります。Drawing<Square,SpecialRedBrush> 型は "DrawingOfSquareRedBrushjpB5LgQ_S" というデータ コントラクト名を持ちます。ここで "jpB5LgQ_S" は "urn:shapes" および "urn:special" 名前空間のハッシュになります。ハッシュを使用しないと 2 つの名前は同一になり、名前の競合が発生することに注意してください。

ジェネリック型のデータ コントラクト名のカスタマイズ

前述のようにジェネリック型用に生成されたデータ コントラクト名を容認できない場合があります。たとえば、名前の競合が起こらないことが前もってわかっているため、ハッシュを削除するとします。この場合、DataContractAttribute 属性の Name プロパティを使用して、名前を生成する別の方法を指定できます。Name プロパティの中かっこ内に数字を指定して、ジェネリック パラメータのデータ コントラクト名を参照できます (0 は最初のパラメータを参照し、1 は 2 番目のパラメータを参照します。以下同様です)。中かっこ内にシャープ記号 (#) を指定すると、ハッシュを参照できます。これらの各参照は、複数回使用しても、まったく使用しなくてもかまいません。

たとえば、前の Drawing ジェネリック型は次の例に示すように宣言できます。

この場合、Drawing<Square,RegularRedBrush> 型は、"Drawing_using_RedBrush_brush_and_Square_shape" というデータ コントラクト名になります。Name プロパティに "{#}" があるため、名前にはハッシュは含まれません。したがって、この型では名前の競合が発生しやすくなります。たとえば、Drawing<Square,SpecialRedBrush> 型は、まったく同じデータ コントラクト名を持ちます。

関連項目

リファレンス

DataContractAttribute
DataMemberAttribute
ContractNamespaceAttribute

概念

データ コントラクトの使用
データ コントラクトの等価性
データ コントラクト名
データ コントラクトのバージョン管理