Freigeben über


Import und Export von Schemas

Windows Communication Foundation (WCF) enthält ein neues Serialisierungsmodul, das DataContractSerializer. Die DataContractSerializer Übersetzung erfolgt zwischen .NET Framework-Objekten und XML (in beide Richtungen). Zusätzlich zum Serialisierer selbst umfasst WCF die zugehörigen Schemaimport- und Schemaexportmechanismen. Das Schema ist eine formale, präzise und maschinenlesbare Beschreibung der XML-Form, die der Serialisierer erzeugt oder auf den der Deserialisierer zugreifen kann. WCF verwendet die XML-Schemadefinitionssprache World Wide Web Consortium (W3C) als Schemadarstellung, die weit mit zahlreichen Drittanbieterplattformen interoperabel ist.

Die Schemaimportkomponente verwendet XsdDataContractImporterein XSD-Schemadokument und generiert .NET Framework-Klassen (normalerweise Datenvertragsklassen), sodass die serialisierten Formulare dem angegebenen Schema entsprechen.

Beispiel: 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 den folgenden Typ (leicht vereinfacht für eine bessere Lesbarkeit).

[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 bewährten Methoden des Datenvertrags folgt (in bewährten Methoden: Datenvertragsversionsverwaltung):

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

  • Datenmitglieder werden als öffentliche Eigenschaften implementiert, die private Felder verpacken.

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

Das XsdDataContractExporter ermöglicht es Ihnen, das Gegenteil zu tun—Typen, die mit dem DataContractSerializer serialisierbar sind, zu nehmen und ein XSD-Schema-Dokument zu erstellen.

Treue ist nicht garantiert

Bei einem Roundtrip wird keine Garantie für die Originaltreue von Schemas oder Typen übernommen. (Ein Roundtrip bedeutet, ein Schema zu importieren, um eine Reihe von Klassen zu erstellen, und das Ergebnis exportieren, um ein Schema erneut zu erstellen.) Dasselbe Schema wird möglicherweise nicht zurückgegeben. Das Umkehren des Prozesses garantiert auch nicht, die Originaltreue zu bewahren. (Exportieren Sie einen Typ, um sein Schema zu generieren, und importieren Sie dann den Typ zurück. Es ist unwahrscheinlich, dass derselbe Typ zurückgegeben wird.)

Unterstützte Typen

Das Datenvertragsmodell unterstützt nur eine begrenzte Teilmenge des WC3-Schemas. Jedes Schema, das dieser Teilmenge nicht entspricht, führt während des Importvorgangs zu einer Ausnahme. Es gibt z. B. keine Möglichkeit, anzugeben, dass ein Datenmitglied eines Datenvertrags als XML-Attribut serialisiert werden soll. Daher werden Schemas, die die Verwendung von XML-Attributen erfordern, nicht unterstützt und führen während des Imports zu Ausnahmen, da es unmöglich ist, einen Datenvertrag mit der richtigen XML-Projektion zu generieren.

Beispielsweise kann das folgende Schemafragment nicht mithilfe der 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 unter Data Contract Schema Reference. Wenn ein Schema nicht den Datenvertragsregeln entspricht, verwenden Sie ein anderes Serialisierungsmodul. Beispielsweise verwendet das XmlSerializer seinen eigenen, separaten Mechanismus zum Schemaimport. Außerdem gibt es einen speziellen Importmodus, in dem der Bereich des unterstützten Schemas erweitert wird. Weitere Informationen finden Sie im Abschnitt zum Generieren von IXmlSerializable Typen im Importschema zum Generieren von Klassen.

Das XsdDataContractExporter unterstützt alle .NET Framework-Typen, die mithilfe des DataContractSerializer serialisiert werden können. Weitere Informationen finden Sie unter Typen, die vom Serializer für den Datenvertrag unterstützt werden. Beachten Sie, dass das mit der XsdDataContractExporter Verwendung generierte Schema normalerweise gültige Daten aufweist, die dies XsdDataContractImporter verwenden kann (es sei denn, das XmlSchemaProviderAttribute Schema wird zum Anpassen des Schemas verwendet).

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

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

Siehe auch