この記事では、この 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 を適用します。
注
DataMemberAttributeは、プライベート メンバーとパブリック メンバーの両方に適用できます。
XML の最終的な形式はテキストである必要はありません。 代わりに、 DataContractSerializer は XML 情報セットとしてデータを書き込みます。これにより、 XmlReader および XmlWriterで認識される任意の形式にデータを書き込みます。 XmlDictionaryReaderクラスとXmlDictionaryWriter クラスを使用して読み取りと書き込みを行うことをお勧めします。これは、どちらもDataContractSerializerで動作するように最適化されているためです。
シリアル化または逆シリアル化の前に設定する必要があるフィールドまたはプロパティを持つクラスを作成する場合は、「シリアル化 コールバックのVersion-Tolerant」で説明されているように、コールバック属性を使用します。
既知の型のコレクションに追加する
オブジェクトをシリアル化または逆シリアル化するときは、型が DataContractSerializerに "既知" である必要があります。 まず、 IEnumerable<T> ( List<T> など) を実装するクラスのインスタンスを作成し、既知の型をコレクションに追加します。 次に、DataContractSerializerを受け取るオーバーロードの 1 つ (たとえば、IEnumerable<T>) を使用して、DataContractSerializer(Type, IEnumerable<Type>)のインスタンスを作成します。
注
他のプリミティブ型とは異なり、 DateTimeOffset 構造体は既定では既知の型ではないため、既知の型の一覧に手動で追加する必要があります ( データ コントラクトの既知の型を参照)。
将来互換性
DataContractSerializerは、コントラクトの将来のバージョンと互換性を持つよう設計されたデータ コントラクトを理解します。 このような型は、 IExtensibleDataObject インターフェイスを実装します。 インターフェイスは、ExtensionData オブジェクトを返すExtensionDataObjectプロパティを備えています。 詳細については、「 Forward-Compatible データ コントラクト」を参照してください。
部分的な信頼で実行する
逆シリアル化中にターゲット オブジェクトをインスタンス化する場合、 DataContractSerializer はターゲット オブジェクトのコンストラクターを呼び出しません。 部分信頼からアクセス可能な [DataContract] 型 (つまり、 AllowPartiallyTrustedCallers
属性が適用されたパブリックアセンブリ) を作成し、セキュリティ関連のアクションを実行する場合は、コンストラクターが呼び出されないことに注意する必要があります。 特に、次の手法は機能しません。
- コンストラクターを内部またはプライベートにするか、コンストラクターに
LinkDemand
を追加して部分信頼アクセスを制限しようとすると、どちらも部分信頼の逆シリアル化中に影響を受けないようにします。 - コンストラクターが実行されたことを前提とするクラスをコーディングすると、そのクラスが悪用可能な無効な内部状態になる可能性があります。
.NET