DataContractSerializer クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
ある型のインスタンスを、提供されたデータ コントラクトを使用して、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
- 継承
例
次のコード例は、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 は、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 では、データは、XmlReader と XmlWriter によって認識される任意の形式にデータを書き込むことができる 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 コンストラクトを使用するかどうか、カスタム シリアル化のためのサロゲート、および実行時の |
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 要素と名前空間、および実行時の |
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 のパラメーター、および実行時の |
プロパティ
DataContractResolver |
既知のコントラクト型に |
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 ドキュメントまたはドキュメント ストリームを読み取り、逆シリアル化されたオブジェクトを返します。 メソッドには、オブジェクト名を検証するかどうかを指定するパラメーター、および実行時の |
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 ドキュメントまたはストリームに書き込みます。 メソッドには、実行時の |
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 のサロゲート シリアル化プロバイダーを指定します。 |
適用対象
スレッド セーフ
このクラスのインスタンスは、インスタンスが または DataContractResolverの実装IDataContractSurrogateで使用される場合を除き、スレッド セーフです。