スキーマのインポートとエクスポート

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 クラス (通常、データ コントラクト クラス) を生成します。

たとえば、次のスキーマ フラグメントがあるとします。

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 インターフェイスを実装します。 詳細については、「上位互換性のあるデータ コントラクト」を参照してください。

  • データ メンバーは、プライベート フィールドをラップするパブリック プロパティとして実装されます。

  • クラスは部分クラスであり、生成されたコードを変更せずに追加を行うことができます。

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 の使用に関する詳細については、「クラスからのスキーマのエクスポート」を参照してください。

関連項目