DataContractSerializer クラス

定義

ある型のインスタンスを、提供されたデータ コントラクトを使用して、XML ストリームまたはドキュメントにシリアル化または逆シリアル化します。 このクラスは継承できません。

public ref class DataContractSerializer sealed : System::Runtime::Serialization::XmlObjectSerializer
public sealed class DataContractSerializer : System.Runtime.Serialization.XmlObjectSerializer
type DataContractSerializer = class
    inherit XmlObjectSerializer
Public NotInheritable Class DataContractSerializer
Inherits XmlObjectSerializer
継承
DataContractSerializer

次のコード例は、Person によってシリアル化される DataContractSerializer という名前の型を示しています。 +DataContractAttribute 属性がクラスに適用され、シリアル化の対象を DataMemberAttribute に指示する DataContractSerializer がメンバーに適用されます。

namespace DataContractSerializerExample
{
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Runtime.Serialization;
    using System.Xml;

    // You must apply a DataContractAttribute or SerializableAttribute
    // to a class to have it serialized by the DataContractSerializer.
    [DataContract(Name = "Customer", Namespace = "http://www.contoso.com")]
    class Person : IExtensibleDataObject
    {
        [DataMember()]
        public string FirstName;
        [DataMember]
        public string LastName;
        [DataMember()]
        public int ID;

        public Person(string newfName, string newLName, int newID)
        {
            FirstName = newfName;
            LastName = newLName;
            ID = newID;
        }

        private ExtensionDataObject extensionData_Value;

        public ExtensionDataObject ExtensionData
        {
            get
            {
                return extensionData_Value;
            }
            set
            {
                extensionData_Value = value;
            }
        }
    }

    public sealed class Test
    {
        private Test() { }

        public static void Main()
        {
            try
            {
                WriteObject("DataContractSerializerExample.xml");
                ReadObject("DataContractSerializerExample.xml");
            }

            catch (SerializationException serExc)
            {
                Console.WriteLine("Serialization Failed");
                Console.WriteLine(serExc.Message);
            }
            catch (Exception exc)
            {
                Console.WriteLine(
                "The serialization operation failed: {0} StackTrace: {1}",
                exc.Message, exc.StackTrace);
            }

            finally
            {
                Console.WriteLine("Press <Enter> to exit....");
                Console.ReadLine();
            }
        }

        public static void WriteObject(string fileName)
        {
            Console.WriteLine(
                "Creating a Person object and serializing it.");
            Person p1 = new Person("Zighetti", "Barbara", 101);
            FileStream writer = new FileStream(fileName, FileMode.Create);
            DataContractSerializer ser =
                new DataContractSerializer(typeof(Person));
            ser.WriteObject(writer, p1);
            writer.Close();
        }

        public static void ReadObject(string fileName)
        {
            Console.WriteLine("Deserializing an instance of the object.");
            FileStream fs = new FileStream(fileName,
            FileMode.Open);
            XmlDictionaryReader reader =
                XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
            DataContractSerializer ser = new DataContractSerializer(typeof(Person));

            // Deserialize the data and read it from the instance.
            Person deserializedPerson =
                (Person)ser.ReadObject(reader, true);
            reader.Close();
            fs.Close();
            Console.WriteLine(String.Format("{0} {1}, ID: {2}",
            deserializedPerson.FirstName, deserializedPerson.LastName,
            deserializedPerson.ID));
        }
    }
' You must apply a DataContractAttribute or SerializableAttribute
' to a class to have it serialized by the DataContractSerializer.
<DataContract(Name := "Customer", [Namespace] := "http://www.contoso.com")>  _
Class Person
    Implements IExtensibleDataObject
    <DataMember()>  _
    Public FirstName As String
    <DataMember()>  _
    Public LastName As String
    <DataMember()>  _
    Public ID As Integer
    
    Public Sub New(ByVal newfName As String, ByVal newLName As String, ByVal newID As Integer) 
        FirstName = newfName
        LastName = newLName
        ID = newID
    End Sub 
    
    Private extensionData_Value As ExtensionDataObject
    
    Public Property ExtensionData() As ExtensionDataObject Implements _
       IExtensibleDataObject.ExtensionData
        Get
            Return extensionData_Value
        End Get
        Set
            extensionData_Value = value
        End Set
    End Property
End Class 


NotInheritable Public Class Test
    
    Private Sub New() 
    
    End Sub 
     
    Public Shared Sub Main() 
        Try
            WriteObject("DataContractSerializerExample.xml")
            ReadObject("DataContractSerializerExample.xml")
        
        Catch serExc As SerializationException
            Console.WriteLine("Serialization Failed")
            Console.WriteLine(serExc.Message)
        Catch exc As Exception
            Console.WriteLine("The serialization operation failed: {0} StackTrace: {1}", exc.Message, exc.StackTrace)
        
        Finally
            Console.WriteLine("Press <Enter> to exit....")
            Console.ReadLine()
        End Try
    End Sub 
    
    Public Shared Sub WriteObject(ByVal fileName As String) 
        Console.WriteLine("Creating a Person object and serializing it.")
        Dim p1 As New Person("Zighetti", "Barbara", 101)
        Dim writer As New FileStream(fileName, FileMode.Create)
        Dim ser As New DataContractSerializer(GetType(Person))
        ser.WriteObject(writer, p1)
        writer.Close()
    End Sub 

    Public Shared Sub ReadObject(ByVal fileName As String) 
        Console.WriteLine("Deserializing an instance of the object.")
        Dim fs As New FileStream(fileName, FileMode.Open)
        Dim reader As XmlDictionaryReader = _
            XmlDictionaryReader.CreateTextReader(fs, New XmlDictionaryReaderQuotas())
        Dim ser As New DataContractSerializer(GetType(Person))
        
        ' Deserialize the data and read it from the instance.
        Dim deserializedPerson As Person = CType(ser.ReadObject(reader, True), Person)
        reader.Close()
        fs.Close()
        Console.WriteLine(String.Format("{0} {1}, ID: {2}", deserializedPerson.FirstName, deserializedPerson.LastName, deserializedPerson.ID))
    End Sub 
End Class

注釈

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

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

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

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

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

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

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

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

注意

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

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

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

コレクションへの既知の型の追加

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

注意

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

上位互換性

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

部分信頼での実行

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

  • コンストラクターを内部またはプライベートにする、または LinkDemand をコンストラクターに追加することにより、部分信頼アクセスを制限しようとしても、部分信頼での逆シリアル化中は、いずれも有効にはなりません。

  • コンストラクターが実行していることを前提とするクラスをプログラムすると、クラスが、攻撃に利用できる、無効な内部状態になる可能性があります。

コンストラクター

DataContractSerializer(Type)

DataContractSerializer クラスの新しいインスタンスを初期化し、指定した型のオブジェクトをシリアル化または逆シリアル化します。

DataContractSerializer(Type, DataContractSerializerSettings)

指定した型と設定をシリアル化または逆シリアル化する DataContractSerializer クラスの新しいインスタンスを初期化します。

DataContractSerializer(Type, IEnumerable<Type>)

DataContractSerializer クラスの新しいインスタンスを初期化し、指定した型のオブジェクトと、オブジェクト グラフ内に存在可能な既知の型のコレクションをシリアル化または逆シリアル化します。

DataContractSerializer(Type, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate)

DataContractSerializer クラスの新しいインスタンスを初期化し、指定した型のオブジェクトをシリアル化または逆シリアル化します。 このメソッドは、さらに、オブジェクト グラフ内に存在可能な既知の型のリスト、シリアル化するグラフ項目の最大数、予想外のデータを無視するためのパラメーター、グラフ内のオブジェクトの参照データを保持するために非標準の XML コンストラクトを使用するかどうか、およびカスタム シリアル化のためのサロゲートを指定します。

DataContractSerializer(Type, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate, DataContractResolver)

DataContractSerializer クラスの新しいインスタンスを初期化し、指定した型のオブジェクトをシリアル化または逆シリアル化します。 このメソッドは、さらに、オブジェクト グラフ内に存在可能な既知の型のリスト、シリアル化するグラフ項目の最大数、予想外のデータを無視するためのパラメーター、グラフ内のオブジェクトの参照データを保持するために非標準の XML コンストラクトを使用するかどうか、カスタム シリアル化のためのサロゲート、および実行時の xsi:type 宣言のマッピングの代替を指定します。

DataContractSerializer(Type, String, String)

DataContractSerializer クラスの新しいインスタンスを初期化し、指定した型のオブジェクトを、指定した XML ルート要素と名前空間を使用してシリアル化または逆シリアル化します。

DataContractSerializer(Type, String, String, IEnumerable<Type>)

DataContractSerializer クラスの新しいインスタンスを初期化し、指定した型のオブジェクトをシリアル化または逆シリアル化します。 このメソッドは、さらに、XML ルート要素と名前空間を示す 2 つの文字列パラメーターと、オブジェクト グラフ内に存在可能な既知の型のリストを指定します。

DataContractSerializer(Type, String, String, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate)

DataContractSerializer クラスの新しいインスタンスを初期化し、指定した型のオブジェクトをシリアル化または逆シリアル化します。 このメソッドは、さらに、オブジェクト グラフ内に存在可能な既知の型のリスト、シリアル化するグラフ項目の最大数、予想外のデータを無視するためのパラメーター、グラフ内のオブジェクトの参照データを保持するために非標準の XML コンストラクトを使用するかどうか、カスタム シリアル化のためのサロゲート、およびコンテンツを含む XML 要素と名前空間を指定します。

DataContractSerializer(Type, String, String, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate, DataContractResolver)

DataContractSerializer クラスの新しいインスタンスを初期化し、指定した型のオブジェクトをシリアル化または逆シリアル化します。 このメソッドは、さらに、オブジェクト グラフ内に存在可能な既知の型のリスト、シリアル化するグラフ項目の最大数、予想外のデータを無視するためのパラメーター、グラフ内のオブジェクトの参照データを保持するために非標準の XML コンストラクトを使用するかどうか、カスタム シリアル化のためのサロゲート、コンテンツを含む XML 要素と名前空間、および実行時の xsi:type 宣言のマップの代替を指定します。

DataContractSerializer(Type, XmlDictionaryString, XmlDictionaryString)

DataContractSerializer クラスの新しいインスタンスを初期化し、指定した型のオブジェクトを、XmlDictionaryString のパラメーターを通して指定した XML ルート要素と名前空間を使用してシリアル化または逆シリアル化します。

DataContractSerializer(Type, XmlDictionaryString, XmlDictionaryString, IEnumerable<Type>)

DataContractSerializer クラスの新しいインスタンスを初期化し、指定した型のオブジェクトをシリアル化または逆シリアル化します。 このメソッドは、さらに、XML ルート要素と名前空間を示す 2 つの XmlDictionaryString パラメーターと、オブジェクト グラフ内に存在可能な既知の型のリストを指定します。

DataContractSerializer(Type, XmlDictionaryString, XmlDictionaryString, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate)

DataContractSerializer クラスの新しいインスタンスを初期化し、指定した型のオブジェクトをシリアル化または逆シリアル化します。 このメソッドは、さらに、オブジェクト グラフ内に存在可能な既知の型のリスト、シリアル化するグラフ項目の最大数、予想外のデータを無視するためのパラメーター、グラフ内のオブジェクトの参照データを保持するために非標準の XML コンストラクトを使用するかどうか、カスタム シリアル化のためのサロゲート、およびコンテンツを含む XML 要素と名前空間を指定する XmlDictionaryString のパラメーターを指定します。

DataContractSerializer(Type, XmlDictionaryString, XmlDictionaryString, IEnumerable<Type>, Int32, Boolean, Boolean, IDataContractSurrogate, DataContractResolver)

DataContractSerializer クラスの新しいインスタンスを初期化し、指定した型のオブジェクトをシリアル化または逆シリアル化します。 このメソッドは、さらに、オブジェクト グラフ内に存在可能な既知の型のリスト、シリアル化するグラフ項目の最大数、予想外のデータを無視するためのパラメーター、グラフ内のオブジェクトの参照データを保持するために非標準の XML コンストラクトを使用するかどうか、カスタム シリアル化のためのサロゲート、コンテンツを含む XML 要素と名前空間を指定する XmlDictionaryString のパラメーター、および実行時の xsi:type 宣言のマップの代替を指定します。

プロパティ

DataContractResolver

既知のコントラクト型に xsi:type 宣言を動的にマップするために使用するコンポーネントを取得します。

DataContractSurrogate

シリアル化または逆シリアル化プロセスを拡張できるサロゲート型を取得します。

IgnoreExtensionDataObject

クラスがシリアル化または逆シリアル化されるときに、そのクラスの拡張により提供されるデータを無視するかどうかを指定する値を取得します。

KnownTypes

DataContractSerializer のこのインスタンスを使用してシリアル化されるオブジェクト グラフ内に存在可能な型のコレクションを取得します。

MaxItemsInObjectGraph

シリアル化または逆シリアル化するオブジェクト グラフ内の項目の最大数を取得します。

PreserveObjectReferences

オブジェクトの参照データを保持するために非標準の XML コンストラクトを使用するかどうかを示す値を取得します。

SerializeReadOnlyTypes

読み取り専用の型をシリアル化するかどうかを指定する値を取得します。

メソッド

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
IsStartObject(XmlDictionaryReader)

逆シリアル化できるオブジェクトに XmlDictionaryReader が配置されているかどうかを決定します。

IsStartObject(XmlReader)

逆シリアル化できるオブジェクトに XmlReader が配置されているかどうかを決定します。

MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
ReadObject(Stream)

Stream を使用して XML ストリームまたはドキュメントを読み取り、逆シリアル化されたオブジェクトを返します。

(継承元 XmlObjectSerializer)
ReadObject(XmlDictionaryReader)

XmlDictionaryReader を使用して XML ドキュメントまたはストリームを読み取り、逆シリアル化されたオブジェクトを返します。

(継承元 XmlObjectSerializer)
ReadObject(XmlDictionaryReader, Boolean)

XmlDictionaryReader を使用して XML ストリームを読み取り、逆シリアル化されたオブジェクトを返します。さらに、値を読み取る前にオブジェクト名の検証チェックを行うかどうかを指定します。

ReadObject(XmlDictionaryReader, Boolean, DataContractResolver)

XML ドキュメントまたはドキュメント ストリームを読み取り、逆シリアル化されたオブジェクトを返します。 メソッドには、オブジェクト名を検証するかどうかを指定するパラメーター、および実行時の xsi:type 宣言のマッピングに使用するリゾルバーが含まれます。

ReadObject(XmlReader)

XmlReader を使用して XML ストリームを読み取り、逆シリアル化されたオブジェクトを返します。

ReadObject(XmlReader, Boolean)

XmlReader を使用して XML ストリームを読み取り、逆シリアル化されたオブジェクトを返します。さらに、値を読み取る前にオブジェクト名の検証チェックを行うかどうかを指定します。

ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)
WriteEndObject(XmlDictionaryWriter)

XmlDictionaryWriter を使用して、XML の終了要素を書き込みます。

WriteEndObject(XmlWriter)

XmlWriter を使用して、XML の終了要素を書き込みます。

WriteObject(Stream, Object)

Stream を使用して、オブジェクトの完全なコンテンツ (開始、コンテンツ、および終了) を XML ドキュメントまたはストリームに書き込みます。

(継承元 XmlObjectSerializer)
WriteObject(XmlDictionaryWriter, Object)

XmlDictionaryWriter を使用して、オブジェクトの完全なコンテンツ (開始、コンテンツ、および終了) を XML ドキュメントまたはストリームに書き込みます。

(継承元 XmlObjectSerializer)
WriteObject(XmlDictionaryWriter, Object, DataContractResolver)

指定した XmlDictionaryWriter を使用して、すべてのオブジェクト データ (XML の開始要素、コンテンツ、外側の要素) を XML ドキュメントまたはストリームに書き込みます。 メソッドには、実行時の xsi:type 宣言のマッピングに使用するリゾルバーが含まれます。

WriteObject(XmlWriter, Object)

XmlWriter を使用して、すべてのオブジェクト データ (XML の開始要素、コンテンツ、終了要素) を XML ドキュメントまたはストリームに書き込みます。

WriteObjectContent(XmlDictionaryWriter, Object)

XmlDictionaryWriter を使用して、XML コンテンツを書き込みます。

WriteObjectContent(XmlWriter, Object)

XmlWriter を使用して、XML コンテンツを書き込みます。

WriteStartObject(XmlDictionaryWriter, Object)

XmlDictionaryWriter を使用して、XML の開始要素を書き込みます。

WriteStartObject(XmlWriter, Object)

XmlWriter を使用して、XML の開始要素を書き込みます。

拡張メソッド

GetSerializationSurrogateProvider(DataContractSerializer)

このシリアライザーのサロゲート シリアル化プロバイダーを返します。

SetSerializationSurrogateProvider(DataContractSerializer, ISerializationSurrogateProvider)

この DataContractSerializer のサロゲート シリアル化プロバイダーを指定します。

適用対象

スレッド セーフ

このクラスのインスタンスは、インスタンスが または の実装で使用されている場合を除き、スレッド セーフ IDataContractSurrogate です DataContractResolver

こちらもご覧ください