System.Runtime.Serialization.DataContractAttribute クラス

この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。

DataContractAttribute によるシリアル化および逆シリアル化操作で使用される型 (クラス、構造体、または列挙) に対して、DataContractSerializer 属性を適用します。 Windows Communication Foundation (WCF) インフラストラクチャを使用してメッセージを送受信する場合は、メッセージで送信されたデータを保持および操作するクラスにも適用 DataContractAttribute する必要があります。 データ コントラクトの詳細については、「データ コントラクトの使用」を参照してください。

シリアル化する値を保持するフィールド、プロパティ、またはイベントにも、DataMemberAttribute を適用する必要があります。 DataContractAttribute の適用によって、DataContractSerializer によるデータのシリアル化と逆シリアル化を明示的に有効にします。

注意

プライベートなフィールドに対して DataMemberAttribute を適用できます。 フィールドによって返されるデータは (プライベートであっても) シリアル化と逆シリアル化の対象となるため、悪意のあるユーザーやプロセスによって傍受される可能性があることに注意してください。

データ コントラクトの詳細については、「データ コントラクトの使用」に 記載されているトピックを参照してください。

データ コントラクト

データ コントラクトは、各フィールドの名前とデータ型を持つ一連のフィールドの抽象的な説明です。 データ コントラクトは、単一の実装の外部に存在することで、異なるプラットフォームでのサービスの相互運用を可能にします。 サービス間で渡されるデータが同一のコントラクトに準拠している限り、すべてのサービスがそのデータを処理できます。 この処理は疎結合システムとも呼ばれます。 データ コントラクトは、アプリケーションによる処理が可能なようにデータを伝送する方法を指定するという点でインターフェイスに似ています。 たとえば、"FirstName" と "LastName" という 2 つのテキスト フィールドがある "Person" という名前のデータ型をデータ コントラクトで呼び出すことができます。 データ コントラクトを作成するには、DataContractAttribute をクラスに適用し、シリアル化する必要がある任意のフィールドまたはプロパティに DataMemberAttribute を適用します。 データがシリアル化されるときに、データは、型に暗黙的に組み込まれたデータ コントラクトに従って処理されます。

Note

データ コントラクトは、継承動作の点で、実際のインターフェイスとは大きく異なります。 インターフェイスは、任意の派生する型によって継承されます。 DataContractAttribute を基本クラスに適用しても、派生する型は、属性も動作も継承しません。 ただし、派生する型にデータ コントラクトがある場合、基本クラスのデータ メンバーはシリアル化されます。 しかし、派生クラスの新しいメンバーをシリアル化可能にするには、新しいメンバーに対して DataMemberAttribute を適用する必要があります。

XML スキーマ ドキュメントと SvcUtil ツール

他のサービスとデータを交換する場合は、データ コントラクトを記述する必要があります。 DataContractSerializer の現在のバージョンでは、XML スキーマを使用してデータ コントラクトを定義できます (その他の形式のメタデータ/説明は、同じ目的で使用できます)。アプリケーションから XML スキーマを作成するには、ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) と /dconly コマンド ライン オプションを使用します。 ツールへの入力が既定ではアセンブリの場合、ツーは、そのアセンブリで検出されたすべてのデータ コントラクトの型を定義する XML スキーマ セットを生成します。 逆に、Svcutil.exe ツールは、データ コントラクトによって表現できる構造体を使用する XML スキーマの要件に適合する Visual Basic または C# クラスの定義を作成するために使用することもできます。 この場合、 /dconly コマンド ライン オプションは必要ありません。

Svcutil.exe ツールへの入力が既定では XML スキーマの場合、ツールは、クラスのセットを作成します。 これらのクラスを確認すれば、DataContractAttribute が適用されていることがわかります。 これらのクラスを使用して、他のサービスと交換する必要があるデータを処理するための新しいアプリケーションを作成できます。

Web サービス記述言語 (WSDL) ドキュメントを返すエンドポイントに対してツールを実行して、Windows Communication Foundation (WCF) クライアントを作成するコードと構成を自動的に生成することもできます。 生成されたコードには、DataContractAttribute でマークされた型が含まれます。

既存の型を再利用する

データ コントラクトには、安定名とメンバー リストという 2 つの基本的な要件があります。 安定名は、名前空間の URI (uniform resource identifier) とコントラクトのローカル名で構成されます。 既定では、クラスに適用 DataContractAttribute すると、クラス名がローカル名として使用され、クラスの名前空間 (プレフィックスが付いた "http://schemas.datacontract.org/2004/07/") が名前空間 URI として使用されます。 Name プロパティと Namespace プロパティを設定することで、これらの既定値をオーバーライドできます。 ContractNamespaceAttribute を名前空間に適用することで、名前空間を変更することもできます。 この機能は、目的どおりにデータを処理する既存の型が存在するが、データ コントラクトの名前空間とクラス名が異なる場合に使用します。 既定値をオーバーライドすることで、既存の型を再利用しながら、シリアル化するデータをデータ コントラクトに準拠させることができます。

Note

コードでは、DataContract の代わりに DataContractAttribute という短い語を使用できます。

バージョン管理

データ コントラクトは、それ自体の新しいバージョンに対応できます。 つまり、コントラクトの次のバージョンに追加データが含まれている場合、そのデータは保存され、送信側にそのまま返送されます。 これを行うには、IExtensibleDataObject インターフェイスを実装します。

バージョン管理の詳細については、「データ コントラクトのバージョン管理」を参照してください