Import und Export von Schemas

Windows Communication Foundation (WCF) enthält ein neues Serialisierungsmodul, den DataContractSerializer. DataContractSerializer übersetzt zwischen .NET Framework-Objekten und XML (in beiden Richtungen). Neben dem Serialisierungsmodul umfasst WCF auch zugeordnete Import- und Exportmechanismen für Schemas. Ein Schema ist eine formale, genaue und maschinenlesbare Beschreibung der XML-Form, die das Serialisierungsmodul erstellt oder auf die der Deserialisierer zugreifen kann. WCF verwendet die vom World Wide Web Consortium (W3C) definierte XSD-Sprache (XML Schema Definition) für die Schemadarstellung. Diese Sprache ist mit zahlreichen Plattformen von Drittanbietern weitgehend interoperabel.

Die Schemaimportkomponente XsdDataContractImporter generiert anhand eines XSD-Schemadokuments .NET Framework-Klassen (normalerweise Datenvertragsklassen), sodass die serialisierten Formen dem angegebenen Schema entsprechen.

Das folgende Schemafragment:

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"))

generiert beispielsweise den folgenden Typ (zugunsten einer besseren Lesbarkeit leicht vereinfacht).

[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

Beachten Sie, dass der generierte Typ mehreren empfohlenen Vorgehensweisen für Datenverträge (siehe Empfohlene Vorgehensweisen: Versionsverwaltung von Datenverträgen) folgt:

  • Der Typ implementiert die IExtensibleDataObject-Schnittstelle. Weitere Informationen finden Sie unter Aufwärtskompatible Datenverträge.

  • Datenmember werden als öffentliche Eigenschaften implementiert, die private Felder umschließen.

  • Die Klasse ist eine partielle Klasse, und Hinzufügungen können vorgenommen werden, ohne generierten Code zu ändern.

Mit XsdDataContractExporter können Sie umgekehrt verfahren und anhand von Typen, die mit DataContractSerializer serialisierbar sind, ein XSD-Schemadokument generieren.

Keine Garantie für die Originaltreue

Bei einem Roundtrip wird keine Garantie für die Originaltreue von Schemas oder Typen übernommen. (Mit Roundtrip wird der Import eines Schemas zum Erstellen einer Gruppe von Klassen und der Export des Ergebnisses zum Erstellen eines Schemas bezeichnet.) Möglicherweise wird nicht das gleiche Schema zurückgegeben. Auch bei der Umkehrung des Prozesses ist eine Beibehaltung der Originaltreue nicht garantiert. (Exportieren Sie einen Typ, um sein Schema zu generieren, und importieren Sie den Typ dann zurück. Es ist unwahrscheinlich, dass der gleiche Typ zurückgegeben wird.)

Unterstützte Typen

Das Datenvertragsmodell unterstützt nur eine beschränkte Teilmenge des WC3-Schemas. Jedes Schema, das dieser Teilmenge nicht entspricht, verursacht während des Importprozesses eine Ausnahme. Es gibt beispielsweise keine Möglichkeit festzulegen, dass ein Datenmember eines Datenvertrags als XML-Attribut serialisiert werden soll. Schemas, die XML-Attribute erfordern, werden daher nicht unterstützt und verursachen beim Import Ausnahmen, da es nicht möglich ist, einen Datenvertrag mit der richtigen XML-Projektion zu generieren.

Das folgende Schemafragment kann z. B. nicht mit den Standardimporteinstellungen importiert werden.

<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>

Weitere Informationen finden Sie in der Datenvertrags-Schemareferenz. Wenn ein Schema den Datenvertragsregeln nicht entspricht, verwenden Sie eine andere Serialisierungs-Engine. XmlSerializer verwendet z. B. einen eigenen separaten Schemaimportmechanismus. Außerdem gibt es einen speziellen Importmodus, durch den weitere Schemas unterstützt werden. Weitere Informationen finden Sie unter Importieren von Schemas zum Generieren von Klassen im Abschnitt zum Generieren von IXmlSerializable-Typen.

XsdDataContractExporter unterstützt alle .NET Framework-Typen, die mit DataContractSerializer serialisiert werden können. Weitere Informationen finden Sie unter Typen, die vom Serialisierungsmodul für den Datenvertrag unterstützt werden. Beachten Sie, dass mit XsdDataContractExporter generierte Schemas normalerweise gültige Daten sind, die von XsdDataContractImporter verwendet werden können (sofern XmlSchemaProviderAttribute nicht zur Anpassung des Schemas verwendet wird).

Weitere Informationen zur Verwendung von XsdDataContractImporter finden Sie unter Importieren von Schemas zum Generieren von Klassen.

Weitere Informationen zur Verwendung von XsdDataContractExporter finden Sie unter Exportieren von Schemas aus Klassen.

Siehe auch