データ コントラクトの使用
データ コントラクトは、サービスとクライアントの間の正式な取り決めであり、交換されるデータが抽象的に記述されています。つまり、クライアントとサービスが通信するために必要なのは同じデータ コントラクトだけで、同じ型を共有する必要はありません。データ コントラクトは、パラメータまたは戻り値の型ごとに、交換するためにシリアル化する (XML に変換する) 必要があるデータを正確に定義します。
データ コントラクトの基本
Windows Communication Foundation (WCF) は、データ コントラクト シリアライザと呼ばれるシリアル化エンジンを既定で使用して、データのシリアル化と逆シリアル化 (データと XML の間の変換) を行います。すべての .NET Framework プリミティブ型 (整数や文字列など) およびプリミティブ型として扱われる特定の型 (DateTime や XmlElement など) は、準備なしでシリアル化できるため、既定のデータ コントラクトを持つと見なされます。多くの .NET Framework 型もまた、既存のデータ コントラクトを持ちます。シリアル化できるすべての型の一覧については、「データ コントラクト シリアライザでサポートされる型」を参照してください。
新しい複合型を作成したら、シリアル化できるように、データ コントラクトを定義する必要があります。既定では、DataContractSerializer はデータ コントラクトを推測し、公開されている型をすべてシリアル化します。その型の読み書き可能なパブリック プロパティおよびパブリック フィールドは、すべてシリアル化されます。IgnoreDataMemberAttribute を使用することにより、メンバがシリアル化されないようにすることができます。また、DataContractAttribute 属性および DataMemberAttribute 属性を使用して、データ コントラクトを明示的に作成することもできます。これを行うには、通常、その型に DataContractAttribute 属性を適用します。この属性は、クラス、構造体、および列挙体に適用できます。次に、データ コントラクト型の各メンバに DataMemberAttribute 属性を適用して、それがデータ メンバであること、つまり、シリアル化する必要があることを示す必要があります。詳細な情報については、次のページを参照してください。 「シリアル化可能な型」を参照してください。
例
ServiceContractAttribute 属性と OperationContractAttribute 属性が明示的に適用されたサービス コントラクト (インターフェイス) の例を次に示します。この例は、プリミティブ型はデータ コントラクトを必要としないのに対し、複合型は必要とすることを示しています。
次の例では、MyTypes.PurchaseOrder
型のデータ コントラクトが作成され、DataContractAttribute と DataMemberAttribute 属性がクラスとそのメンバに適用されるかを示します。
メモ
以下に、データ コントラクトを作成する際に考慮する必要がある項目を示します。
- IgnoreDataMemberAttribute 属性は、マークされていない型で使用した場合にのみ受け入れられます。これには、DataContractAttribute、SerializableAttribute、CollectionDataContractAttribute、EnumMemberAttribute のいずれかの属性でマークされていない型、または他の方法 (IXmlSerializable など) でシリアル化可能としてマークされた型が含まれます。
- DataMemberAttribute 属性は、フィールド、プロパティ、およびイベントに適用できます。
- メンバのアクセシビリティ レベル (内部、プライベート、保護、またはパブリック) は、データ コントラクトに影響しません。
- DataMemberAttribute 属性が静的メンバに適用されている場合は無視されます。
- シリアル化中には、プロパティのデータ メンバがシリアル化対象のプロパティの値を取得できるように、プロパティ取得コードが呼び出されます。
- 逆シリアル化中には、まず初期化されていないオブジェクトが、その型のコンストラクタを呼び出さずに作成されます。次に、すべてのデータ メンバが逆シリアル化されます。
- 逆シリアル化中には、プロパティのデータ メンバが、プロパティを逆シリアル化されている値に設定できるように、プロパティ設定コードが呼び出されます。
- データ コントラクトが有効であるためには、すべてのデータ メンバをシリアル化できる必要があります。シリアル化できるすべての型の一覧については、「データ コントラクト シリアライザでサポートされる型」を参照してください。
ジェネリック型は、非ジェネリック型とまったく同じように処理されます。ジェネリック パラメータに対する特別な要件はありません。たとえば、次の型について考えます。
この型は、ジェネリック型パラメータ (T) に使用される型をシリアル化できるかどうかに関係なくシリアル化できます。すべてのデータ メンバをシリアル化できる必要があるため、次の型をシリアル化できるのは、ジェネリック型パラメータもシリアル化できる場合だけです。次のコード例を参照してください。
関連項目
タスク
方法 : クラスまたは構造体に基本的なデータ コントラクトを作成する
リファレンス
DataMemberAttribute
DataContractAttribute
概念
シリアル化可能な型
データ コントラクト名
データ コントラクトの等価性
データ メンバの順序
既知のデータ コントラクト型
上位互換性のあるデータ コントラクト
データ コントラクトのバージョン管理
バージョン トレラントなシリアル化コールバック
データ メンバの既定値
データ コントラクト シリアライザでサポートされる型