スキーマのインポートとエクスポート
Windows Communication Foundation (WCF) には新しいシリアル化エンジン、DataContractSerializer が含まれます。DataContractSerializer は、.NET Framework オブジェクトと XML を双方向で変換します。このシリアライザー自体の他に、WCF には、関連するスキーマ インポート機構とスキーマ エクスポート機構が用意されています。スキーマとは、シリアライザーが生成するか、またはデシリアライザーがアクセスできる XML の形状に関する記述で、正式かつ正確であり、コンピューターによる読み取りが可能です。WCF は、多数のサードパーティ プラットフォームとの広範な相互運用性を有する W3C (World Wide Web Consortium) XML スキーマ定義言語 (XSD: XML Schema Definition Language) をスキーマ表現として使用します。
スキーマ インポート コンポーネント XsdDataContractImporter は、XSD スキーマ ドキュメントを受け取って、シリアル化された形式が特定のスキーマに対応するように .NET Framework クラス (通常、データ コントラクト クラス) を生成します。
たとえば、次のスキーマ フラグメントがあるとします。
<xs:complexType name="Vehicle">
<xs:sequence>
<xs:element name="year" type="xs:int" />
<xs:element name="color" type="xs:string" />
</xs:sequence>
</xs:complexType>
これは、読みやすいように、やや簡素化された次の型を生成します。
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
[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;}
}
}
生成された型は、「ベスト プラクティス : データ コントラクトのバージョン管理」に記載されているデータ コントラクトに関する以下のベスト プラクティスに従っていることに注意してください。
この型は IExtensibleDataObject インターフェイスを実装します。詳細については、次のトピックを参照してください。、「上位互換性のあるデータ コントラクト」を参照してください。
データ メンバーは、プライベート フィールドをラップするパブリック プロパティとして実装されます。
クラスは部分クラスであり、生成されたコードを変更せずに追加を行うことができます。
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 を使用して作成されたスキーマは、XmlSchemaProviderAttribute を使用してカスタマイズしない限り、XsdDataContractImporter で使用できる有効なデータです。
XsdDataContractImporter の使用詳細情報、「クラスを作成するためのスキーマのインポート」を参照してください。
XsdDataContractExporter の使用詳細情報、「クラスからのスキーマのエクスポート」を参照してください。
参照
リファレンス
DataContractSerializer
XsdDataContractImporter
XsdDataContractExporter