System.Runtime.Serialization.DataContractSerializer クラス

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

DataContractSerializer クラスを使用して、ある型のインスタンスを XML ストリームまたはドキュメントにシリアル化または逆シリアル化します。 たとえば、名前や住所などの必須データを含むプロパティを持つ Person という名前の型を作成できます。 その後、Person クラスのインスタンスを作成して操作することで、すべてのプロパティ値を XML ドキュメントに書き込んで後で取得するか、XML ストリームに書き込んで直ちに転送することができます。 最も重要なのは、 DataContractSerializer Windows Communication Foundation (WCF) メッセージで送信されたデータをシリアル化および逆シリアル化するために使用されます。 DataContractAttribute 属性をクラスに適用し、DataMemberAttribute 属性をクラス メンバーに適用して、シリアル化するプロパティとフィールドを指定します。

シリアル化できる型の一覧については、「データ コントラクト シリアライザーでサポートされる型」を参照してください

DataContractSerializer を使用するには、形式の書き込みと読み取りに適したクラスのインスタンスとオブジェクトを最初に作成します (例 : XmlDictionaryWriter のインスタンス)。 その後、WriteObject メソッドを呼び出してデータを保持します。 データを取得するには、データ形式の読み取りに適したオブジェクト (XML ドキュメントの場合は XmlDictionaryReader など) を作成し、ReadObject メソッドを呼び出します。

使用方法の詳細についてはDataContractSerializer、「シリアル化と逆シリアル化」を参照してください

データ コントラクト シリアライザーの型は、クライアント アプリケーション構成ファイルの <dataContractSerializer> 要素を使用して設定できます。

シリアル化または逆シリアル化のためのクラスの準備

DataContractSerializer は、DataContractAttribute クラスおよび DataMemberAttribute クラスと組み合わせて使用します。 シリアル化用のクラスを準備するには、DataContractAttribute をクラスに適用します。 シリアル化するデータを返すクラスの各メンバーに対して、DataMemberAttribute を適用します。 フィールドとプロパティは、アクセシビリティ (プライベート、保護、内部、内部保護、またはパブリック) に関係なくシリアル化できます。

たとえば、Customer プロパティを持つ ID をスキーマで指定したが、Person プロパティを持つ Name が既存のアプリケーションで既に使用されている場合があります。 コントラクトに準拠する型を作成するには、最初に DataContractAttribute をクラスに適用します。 その後、シリアル化するすべてのフィールドまたはプロパティに対して DataMemberAttribute を適用します。

Note

DataMemberAttribute は、プライベート メンバーとパブリック メンバーに適用できます。

XML の最終形式は、テキストである必要はありません。 DataContractSerializer では、データは、XmlReaderXmlWriter によって認識される任意の形式にデータを書き込むことができる XML infoset として書き込まれます。 XmlDictionaryReader クラスと XmlDictionaryWriter クラスは、どちらも DataContractSerializer と連携するように最適化されているため、読み取りと書き込みはこれらのクラスを使用して行うことをお勧めします。

シリアル化または逆シリアル化の前に設定する必要があるフィールドまたはプロパティを持つクラスを作成する場合は、「バージョン トレラントなシリアル化コールバック」の説明に 従って、コールバック属性を使用します

既知の型のコレクションに追加する

オブジェクトをシリアル化または逆シリアル化する場合は、型が DataContractSerializer にとって "既知" である必要があります。 IEnumerable<T> (List<T> など) を実装するクラスのインスタンスを作成し、既知の型をコレクションに追加することから始めます。 次に、(たとえば) をDataContractSerializer受け取るオーバーロードのいずれかを使用してインスタンスDataContractSerializer(Type, IEnumerable<Type>)IEnumerable<T>作成します。

Note

他のプリミティブ型とは異なり、DateTimeOffset構造体は既定では既知の型ではないため、既知の型の一覧に手動で追加する必要があります (データ コントラクトの既知の型を参照)。

上位互換性

DataContractSerializer は、コントラクトの将来のバージョンとの互換性を保つように設計されたデータ コントラクトを理解します。 このような型は、IExtensibleDataObject インターフェイスを実装します。 このインターフェイスは、ExtensionData オブジェクトを返す ExtensionDataObject プロパティを特徴とします。 詳細については、「上位互換性のあるデータ コントラクト」を参照してください。

部分信頼で実行する

逆シリアル化中のターゲット オブジェクトのインスタンス化の際に、DataContractSerializer は、ターゲット オブジェクトのコンストラクターを呼び出しません。 部分信頼からアクセス可能な [DataContract] 型 (つまり、属性が適用されたパブリックアセンブリ AllowPartiallyTrustedCallers 内) を作成し、セキュリティ関連のアクションを実行する場合は、コンストラクターが呼び出されないことに注意する必要があります。 具体的には、以下の手法が機能しません。

  • コンストラクターを内部またはプライベートにする、または LinkDemand をコンストラクターに追加することにより、部分信頼アクセスを制限しようとしても、部分信頼での逆シリアル化中は、いずれも有効にはなりません。
  • コンストラクターが実行していることを前提とするクラスをプログラムすると、クラスが、攻撃に利用できる、無効な内部状態になる可能性があります。