データ コントラクト シリアライザーでサポートされる型
Windows Communication Foundation (WCF) では、データを XML に変換し、変換された XML をデータへ戻すための既定のシリアル化エンジンとして、DataContractSerializer が使用されます。 DataContractSerializer は、 データ コントラクト 型をシリアル化するように設計されています。 ただし、暗黙のデータ コントラクトを持つと考えられるその他の型も多数サポートされています。 以下は、シリアル化可能なすべての型です。
パラメーターを持たないコンストラクターを持つ公開されている型すべて
データ コントラクト型。 DataContractAttribute 属性が適用される型です。 ビジネス オブジェクトを表す新しいカスタム型は、通常、データ コントラクト型として作成されます。 詳細については、「データ コントラクトの使用」と「シリアル化可能な型」を参照してください。
コレクション型。 データのリストを表す型です。 型の通常の配列、または ArrayList や Dictionary<TKey,TValue>などのコレクション型です。 CollectionDataContractAttribute 属性を使用してこれらの型のシリアル化をカスタマイズすることもできますが、必須ではありません。 詳細については、「データ コントラクトのコレクション型」を参照してください。
列挙型。 フラグ列挙体などの列挙体はシリアル化できます。 列挙型は、必要に応じて、 DataContractAttribute 属性でマークできます。その場合は、シリアル化に参加するすべてのメンバーを EnumMemberAttribute 属性でマークする必要があります。 マークされていないメンバーはシリアル化されません。 詳細については、「データ コントラクトの列挙型」を参照してください。
.NET Framework プリミティブ型。 .NET Framework に組み込まれている型 ( Byte、 SByte、 Int16、 Int32、 Int64、 UInt16、 UInt32、 UInt64、 Single、 Double、 Boolean、 Char、 Decimal、 Object、および String) は、すべてシリアル化可能であり、プリミティブ型であると考えられます。
その他のプリミティブ型。 これらの型は .NET Framework のプリミティブではないが、シリアル化された XML 形式ではプリミティブとして扱われます。 この型には、 DateTime、 DateTimeOffset、 TimeSpan、 Guid、 Uri、 XmlQualifiedName、および Byteの配列が含まれます。
Note
他のプリミティブ型とは異なり、 DateTimeOffset は既定では既知の型ではありません。 詳細については、「既知のデータ コントラクト型」を参照してください。
SerializableAttribute 属性でマークされた型。 .NET Framework の基本クラス ライブラリに含まれる多くの型は、このカテゴリに分類されます。 DataContractSerializer は、.NET Framework リモート処理、 BinaryFormatter、および SoapFormatterで使用されていたこのシリアル化プログラミング モデルを完全にサポートします。これは、 ISerializable インターフェイスのサポートを含みます。
未処理の XML を表す型、または ADO.NET のリレーショナル データを表す型。 XmlElement 型および XmlNode 型の配列は、XML を直接表す方法としてサポートされています。 また、 IXmlSerializable インターフェイスを実装する型 (関連する XmlSchemaProviderAttribute 属性、および XDocument 型と XElement 型を含む) もサポートされています。 ADO.NET の DataTable 型と DataSet 型 (およびその型指定された派生クラス) はすべて IXmlSerializable インターフェイスを実装しているので、このカテゴリに属します。 詳細については、「データ コントラクトの XML および ADO.NET の種類」を参照してください。
部分信頼モードにおける特定の型の使用制限
部分信頼モードのシナリオで型を使用する場合、型によっては次の制限があります。
部分信頼コードで ISerializable を使用して DataContractSerializer を実装する型のシリアル化または逆シリアル化を行うには、 SerializationFormatter アクセス許可および UnmanagedCode アクセス許可が必要です。
部分信頼モードで WCF コードを実行すると、
readonly
フィールド (public
とprivate
の両方) のシリアル化と逆シリアル化はサポートされません。 これは、生成された IL が検証不能であるため、より高いアクセス許可が必要になるためです。部分信頼環境では、 DataContractSerializer と XmlSerializer の両方がサポートされています。 ただし、 DataContractSerializer の使用は、次の条件に従う必要があります。
シリアル化可能なすべての
[DataContract]
型はパブリックである必要があります。[DataMember]
型にあるシリアル化可能なすべての[DataContract]
フィールドまたはプロパティは、パブリックで読み書き可能である必要があります。readonly
フィールドのシリアル化と逆シリアル化は、WCF を部分信頼アプリケーションで実行する場合にはサポートされません。部分信頼環境では、
[Serializable]
/ISerializable]
プログラミング モデルはサポートされていません。既知の型はコード内、またはマシン レベルの構成 (
Machine.config
) で指定する必要があります。 既知の型はセキュリティ上の理由からアプリケーション レベルの構成では指定できません。
IObjectReference メソッドにはセキュリティ アクセス許可 GetRealObject が必要であるため、
[SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
を実装した型は、部分信頼環境で例外をスローします。
シリアル化に関するその他のメモ
次の規則はデータ コントラクト シリアライザーによってサポートされる型にも適用されます。
ジェネリック型は、データ コントラクト シリアライザーで完全にサポートされます。
null 許容値型は、データ コントラクト シリアライザーで完全にサポートされます。
インターフェイス型は Object (コレクション インターフェイスの場合はコレクション型) として扱われます。
構造体とクラスの両方がサポートされています。
DataContractSerializer では、XmlSerializer と ASP.NET Web サービスで使用されるプログラミング モデルはサポートされていません。 特に、 XmlElementAttribute や XmlAttributeAttributeのような属性をサポートしていません。 このプログラミング モデルのサポートを有効にするには、DataContractSerializer ではなく XmlSerializer を使用するように WCF を切り替える必要があります。
DBNull 型は、特殊な方法で処理されます。 これは、シングルトン型です。デシリアライザーは、逆シリアル化後にシングルトン制約に従い、シングルトン インスタンスへのすべての
DBNull
参照を指します。DBNull
はシリアル化可能な型であるため、 SerializationFormatter アクセス許可が必要です。