Windows Communication Foundation (WCF) には、新しいシリアル化エンジンである DataContractSerializerが含まれています。
DataContractSerializer
は、.NET Framework オブジェクトと XML (双方向) の間で変換されます。 WCF には、シリアライザー自体に加えて、関連するスキーマインポートおよびスキーマエクスポートメカニズムが含まれています。
スキーマ は、シリアライザーが生成する XML の形状、またはデシリアライザーがアクセスできる XML の形式、正確、およびマシンで読み取り可能な記述です。 WCF では、ワールド ワイド Web コンソーシアム (W3C) XML スキーマ定義言語 (XSD) をスキーマ表現として使用します。これは、多数のサードパーティ プラットフォームと広く相互運用できます。
スキーマ インポート コンポーネント XsdDataContractImporter、XSD スキーマ ドキュメントを受け取り、シリアル化されたフォームが特定のスキーマに対応するように .NET Framework クラス (通常はデータ コントラクト クラス) を生成します。
たとえば、次のスキーマの断片を示します。
XsdDataContractImporter importer = new XsdDataContractImporter();
importer.Options.Namespaces.Add(new KeyValuePair<string, string>("http://schemas.contoso.com/carSchema", "Contoso.Cars"));
Dim importer As New XsdDataContractImporter
importer.Options.Namespaces.Add(New KeyValuePair(Of String, String)("http://schemas.contoso.com/carSchema", "Contoso.Cars"))
では、次の型が生成されます (読みやすくするために少し簡略化されています)。
[DataContract]
public partial class Vehicle : IExtensibleDataObject
{
private int yearField;
private string colorField;
[DataMember]
public int year
{
get { return this.yearField; }
set { this.yearField = value; }
}
[DataMember]
public string color
{
get { return this.colorField; }
set { this.colorField = value; }
}
private ExtensionDataObject extensionDataField;
public ExtensionDataObject ExtensionData
{
get { return this.extensionDataField; }
set { this.extensionDataField = value; }
}
}
Partial Class Vehicle
Implements IExtensibleDataObject
Private yearField As Integer
Private colorField As String
<DataMember()> _
Public Property year() As Integer
Get
Return Me.yearField
End Get
Set
Me.yearField = value
End Set
End Property
<DataMember()> _
Public Property color() As String
Get
Return Me.colorField
End Get
Set
Me.colorField = value
End Set
End Property
Private extensionDataField As ExtensionDataObject
Public Property ExtensionData() As ExtensionDataObject _
Implements IExtensibleDataObject.ExtensionData
Get
Return Me.extensionDataField
End Get
Set(ByVal value As ExtensionDataObject)
Me.extensionDataField = value
End Set
End Property
End Class
生成される型は、いくつかのデータ コントラクトのベスト プラクティスに従っています ( ベスト プラクティス: データ コントラクトのバージョン管理にあります)。
この型は、 IExtensibleDataObject インターフェイスを実装します。 詳細については、「 Forward-Compatible データ コントラクト」を参照してください。
データ メンバーは、プライベート フィールドをラップするパブリック プロパティとして実装されます。
クラスは部分クラスであり、生成されたコードを変更せずに追加できます。
XsdDataContractExporterを使用すると、逆の操作を実行できます。これは、DataContractSerializer
でシリアル化可能な型を取得し、XSD スキーマ ドキュメントを生成します。
忠実性は保証されない
スキーマや型のラウンド トリップでの完全な忠実性は保証されません ( ラウンド トリップ とは、スキーマをインポートして一連のクラスを作成し、結果をエクスポートしてスキーマを再度作成することを意味します)。同じスキーマが返されない場合があります。 プロセスを反転しても、忠実性が維持されるとは限りません。 (型をエクスポートしてスキーマを生成し、型をインポートし直します。同じ型が返される可能性はほとんどありません)。
サポートされている型
データ コントラクト モデルでは、WC3 スキーマの限られたサブセットのみがサポートされます。 このサブセットに準拠していないスキーマでは、インポート プロセス中に例外が発生します。 たとえば、データ コントラクトのデータ メンバーを XML 属性としてシリアル化するように指定する方法はありません。 したがって、XML 属性の使用を必要とするスキーマはサポートされていないため、インポート中に例外が発生します。これは、正しい XML プロジェクションを使用してデータ コントラクトを生成できないためです。
たとえば、次のスキーマ フラグメントは、既定のインポート設定を使用してインポートすることはできません。
<xs:complexType name="Vehicle">
<xs:sequence>
<xs:element name="year" type="xs:int" />
<xs:element name="color" type="xs:string" />
</xs:sequence>
<xs:attribute name="engineHorsePower" type="xs:int" />
</xs:complexType>
詳細については、「 データ コントラクト スキーマ リファレンス」を参照してください。 スキーマがデータ コントラクト規則に準拠していない場合は、別のシリアル化エンジンを使用します。 たとえば、 XmlSerializer は独自のスキーマ インポート メカニズムを使用します。 また、サポートされているスキーマの範囲を拡張する特殊なインポート モードもあります。 詳細については、「スキーマをインポートしてクラスを生成する」の IXmlSerializable 型 の生成に関するセクションを参照してください。
XsdDataContractExporter
では、DataContractSerializer
でシリアル化できる .NET Framework 型がサポートされます。 詳細については、「 データ コントラクト シリアライザーでサポートされる型」を参照してください。
XsdDataContractExporter
を使用して生成されたスキーマは、通常、XsdDataContractImporter
が使用できる有効なデータであることに注意してください (XmlSchemaProviderAttributeを使用してスキーマをカスタマイズする場合を除く)。
XsdDataContractImporterの使用方法の詳細については、「スキーマをインポートしてクラスを生成する」を参照してください。
XsdDataContractExporterの使用方法の詳細については、「クラスからのスキーマのエクスポート」を参照してください。