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.