この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。
DataContractAttributeによるシリアル化および逆シリアル化操作で使用される型 (クラス、構造体、または列挙型) にDataContractSerializer属性を適用します。 Windows Communication Foundation (WCF) インフラストラクチャを使用してメッセージを送受信する場合は、メッセージで送信されたデータを保持および操作するクラスにも DataContractAttribute を適用する必要があります。 データ コントラクトの詳細については、「データ コントラクトの使用」を参照してください。
シリアル化する値を保持するフィールド、プロパティ、またはイベントにも、 DataMemberAttribute を適用する必要があります。 DataContractAttributeを適用することで、データをシリアル化および逆シリアル化するDataContractSerializerを明示的に有効にします。
注意事項
DataMemberAttributeはプライベート フィールドに適用できます。 フィールドによって返されるデータは (プライベートであっても) シリアル化および逆シリアル化されるため、悪意のあるユーザーまたはプロセスによって表示または傍受される可能性があることに注意してください。
データ コントラクトの詳細については、「データ コントラクトの使用」に記載されているトピックを 参照してください。
データ コントラクト
データ コントラクトは、各フィールドの名前とデータ型を持つ一連のフィールドの抽象的な説明です。 データ コントラクトは、異なるプラットフォーム上のサービスが相互運用できるように、単一の実装の外部に存在します。 サービス間で渡されるデータが同じコントラクトに準拠している限り、すべてのサービスでデータを処理できます。 この処理方法は疎結合システムとも呼ばれます。 データ コントラクトは、アプリケーションで処理できるようにデータを配信する方法をコントラクトが指定するという点でもインターフェイスに似ています。 たとえば、データ コントラクトでは、"FirstName" と "LastName" という名前の 2 つのテキスト フィールドを持つ "Person" という名前のデータ型を呼び出します。 データ コントラクトを作成するには、クラスに DataContractAttribute を適用し、シリアル化する必要があるフィールドまたはプロパティに DataMemberAttribute を適用します。 シリアル化すると、データは型に暗黙的に組み込まれるデータ コントラクトに準拠します。
注
データ コントラクトは、継承動作において実際のインターフェイスとは大きく異なります。 インターフェイスは、任意の派生型によって継承されます。 基底クラスに 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 つの基本的な要件があります。 安定した名前は、名前空間の Uniform Resource Identifier (URI) とコントラクトのローカル名で構成されます。 既定では、 DataContractAttribute をクラスに適用すると、クラス名がローカル名として使用され、クラスの名前空間 (プレフィックスは "http://schemas.datacontract.org/2004/07/"
) が名前空間 URI として使用されます。
NameプロパティとNamespaceプロパティを設定することで、既定値をオーバーライドできます。 名前空間に ContractNamespaceAttribute を適用して、名前空間を変更することもできます。 この機能は、必要なとおりにデータを処理する既存の型があり、データ コントラクトとは異なる名前空間とクラス名がある場合に使用します。 既定値をオーバーライドすることで、既存の型を再利用し、シリアル化されたデータをデータ コントラクトに準拠させることができます。
注
どのコードでも、長いDataContract
ではなく、DataContractAttributeという単語を使用できます。
バージョン管理
データ コントラクトは、それ自体の新しいバージョンにも対応できます。 つまり、コントラクトの新しいバージョンに追加のデータが含まれている場合、そのデータは保存され、そのまま送信者に返されます。 これを行うには、 IExtensibleDataObject インターフェイスを実装します。
バージョン管理の詳細については、「 データ コントラクトのバージョン管理」を参照してください。
.NET