次の方法で共有


XmlSerializer クラスの使用

Windows Communication Foundation (WCF) では、各種のシリアル化テクノロジを使用して、アプリケーション データをクライアントとサービス間で転送される XML に変換できます。この処理をシリアル化といいます。

既定としての DataContractSerializer

WCF の既定では、データ型をシリアル化するのに DataContractSerializer クラスが使用されます。このシリアライザは、次の型をサポートします。

  • プリミティブ型 (整数、文字列、バイト配列など) や、プリミティブとして処理される XmlElementDateTime などの特殊な型。
  • データ コントラクト型 (DataContractAttribute 属性でマークされた型)。
  • ISerializable インターフェイスを実装する型など、SerializableAttribute 属性でマークされた型。
  • IXmlSerializable インターフェイスを実装する型。
  • 多くのジェネリック コレクション型を含む多くの共通コレクション型。

多くの .NET Framework 型は、上に記載した一覧のうち、下 2 つのカテゴリに分類され、したがってシリアル化可能です。シリアル化可能な型の配列もシリアル化可能です。完全な一覧については、「サービス コントラクトでのデータ転送の指定」を参照してください。

新しい WCF サービスを記述する方法としては、データ コントラクト型と共に使用される DataContractSerializer が推奨されます。詳細な情報については、次のページを参照してください。 「データ コントラクトの使用」を参照してください。

XmlSerializer クラスを使用する場合

WCF は XmlSerializer クラスもサポートします。XmlSerializer クラスは、WCF 独自のものではありません。これは、ASP.NET Web サービスが使用するのと同じシリアル化エンジンです。XmlSerializer クラスでは、DataContractSerializer クラスよりもサポートされる型の範囲がずっと狭くなりますが、結果の XML に対する制御の柔軟性に優れています。また、XML スキーマ定義言語 (XSD) 標準のサポート範囲が広く、シリアル化可能な型で宣言型属性が要求されません。詳細な情報については、次のページを参照してください。 .NET Framework のドキュメントの XML シリアル化に関するトピックを参照してください。XmlSerializer クラスは、データ コントラクト型をサポートしません。

Visual Studio の Svcutil.exe またはサービス参照の追加機能を使用して、サードパーティ サービス用のクライアント コードを生成したり、サードパーティ スキーマを利用する場合、適切なシリアライザが自動的に選択されます。スキーマに DataContractSerializer との互換性がない場合は、XmlSerializer が選択されます。

XmlSerializer への手動切り替え

XmlSerializer に手動で切り替える必要が生じる場合もあります。たとえば、次のような場合です。

  • アプリケーションを ASP.NET Web サービスから WCF に移行するときに、新しいデータ コントラクト型を作成するのではなく、既存の XmlSerializer 互換の型を再利用する場合。
  • メッセージに表示する XML に対する正確な制御が必要で、Web サービス記述言語 (WSDL) ドキュメントが利用できない場合。たとえば、DataContractSerializer と互換性がなく、標準化および公開されている特定のスキーマに従う必要のある型を使用して、サービスを作成する場合。
  • 従来の SOAP エンコード標準に従うサービスを作成する場合。

上記を含めた多様な状況で、次のコードに示すように、XmlSerializerFormatAttribute 属性をサービスに適用することにより、XmlSerializer クラスに手動で切り替えることができます。

セキュリティについての考慮事項

ms733901.note(ja-jp,VS.90).gifメモ :
シリアル化エンジンを切り替える場合は注意が必要です。同じ型でも、使用するシリアライザによって XML へのシリアル化方法が異なる場合があります。誤って、不適切なシリアライザを使用すると、公開する意図のない型の情報が公開されるおそれがあります。

たとえば、DataContractSerializer クラスは、データ コントラクト型をシリアル化する場合、DataMemberAttribute 属性でマークされたメンバのみをシリアル化します。XmlSerializer クラスは、すべてのパブリック メンバをシリアル化します。たとえば、次のコードの型を見てください。

XmlSerializer クラスが選択されているサービス コントラクトでこの型が誤って使用された場合、意図したものではなくても creditCardNumber メンバがシリアル化されます。

DataContractSerializer クラスが既定の場合でも、DataContractFormatAttribute 属性をサービス コントラクト型に適用することで、このクラスをサービスに対して明示的に選択できます (ただし、この操作が必要になることはありません)。

サービスで使用するシリアライザはコントラクトにとって不可欠な部分です。別のバインディングを選択しても他の構成設定に変更しても、このシリアライザを変更することはできません。

XmlSerializer クラスについては、セキュリティに関する重要な考慮事項が他にもあります。まず、XmlSerializer クラスを使用するすべての WCF アプリケーションには、情報の漏えいから保護されたキーを使って署名することを強くお勧めします。このことは、XmlSerializer に手動で切り替える場合と、自動切り替えが行われる場合 (Svcutil.exe やサービス参照の追加などのツールによる) の両方でお勧めします。これは、XmlSerializer シリアル化エンジンで事前生成済みのシリアル化アセンブリの読み込みがサポートされており、これらがアプリケーションと同じキーで署名されるためです**。署名されていないアプリケーションは、アプリケーション フォルダやグローバル アセンブリ キャッシュに配置される事前生成済みのシリアル化アセンブリで予想される名前に、悪意のあるアセンブリが一致するという危険性に対して完全に無防備になります。もちろん、攻撃者がこのようなアクションを行うには、この 2 つの場所のいずれかに対する書き込みアクセスをまず取得する必要があります。

XmlSerializer を使用するときに必ず存在するもう 1 つの脅威は、システムの一時フォルダへの書き込みアクセスに関連するものです。XmlSerializer シリアル化エンジンは、このフォルダ内に一時的なシリアル化アセンブリを作成して使用します。一時フォルダへの書き込みアクセスのあるプロセスであれば、悪意のあるコードによってこれらのシリアル化アセンブリが上書きされるおそれがあることに注意してください。

XmlSerializer サポートのルール

XmlSerializer 互換の属性は、コントラクト操作のパラメータまたは戻り値に直接適用できません。ただし、次のコードに示すように、型指定されたメッセージ (メッセージ コントラクトの本文) には適用できます。

型指定されたメッセージのメンバに適用する場合、型指定されたメッセージ属性で競合するプロパティは、この属性によりオーバーライドされます。たとえば、次のコードの ElementName は、Name をオーバーライドします。

XmlSerializer の使用時は、MessageHeaderArrayAttribute 属性はサポートされません。

ms733901.note(ja-jp,VS.90).gifメモ :
この場合、WCF より前にリリースされた XmlSerializer によって、"スキーマのトップ レベルで宣言された要素に maxOccurs > 1 の値を含めることはできません。XmlElementAttribute ではなく、XmlArray または XmlArrayItem を使うか、Wrapped パラメータ スタイルを使って 'more' のラッパー要素を指定してください。" という例外がスローされます。

この例外が出力された場合は、この状況が当てはまるかどうかを調査します。

WCF では、メッセージ コントラクトおよび操作コントラクトでの SoapIncludeAttribute 属性および XmlIncludeAttribute 属性はサポートされていません。代わりに、KnownTypeAttribute 属性を使用してください。

関連項目

タスク

方法 : XmlSerializer を使用する WCF クライアント アプリケーションの起動時間を短縮する

リファレンス

DataContractFormatAttribute
DataContractSerializer
XmlSerializer
MessageHeaderArrayAttribute

概念

サービス コントラクトでのデータ転送の指定
データ コントラクトの使用