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

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

概念

クラスを作成するためのスキーマのインポート
クラスからのスキーマのエクスポート