Delen via


Schema importeren en exporteren

Windows Communication Foundation (WCF) bevat een nieuwe serialisatie-engine, de DataContractSerializer. De DataContractSerializer vertaalt tussen .NET Framework-objecten en XML (in beide richtingen). Naast de serialisatiefunctie zelf bevat WCF gekoppelde mechanismen voor schema importeren en schema-export. Schema is een formele, nauwkeurige en machineleesbare beschrijving van de vorm van XML die door de serialisatiefunctie wordt geproduceerd of waartoe de deserializer toegang heeft. WCF maakt gebruik van de W3C XML Schema Definition Language (XSD) van het World Wide Web Consortium (W3C) als schemaweergave, die veel compatibel is met talloze platformen van derden.

Het importonderdeel schema, XsdDataContractImporterneemt een XSD-schemadocument en genereert .NET Framework-klassen (normaal gesproken gegevenscontractklassen) zodat de geserialiseerde formulieren overeenkomen met het opgegeven schema.

Bijvoorbeeld het volgende 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"))

genereert het volgende type (vereenvoudigd iets voor betere leesbaarheid).

[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

Houd er rekening mee dat het gegenereerde type verschillende aanbevolen procedures voor gegevenscontracten volgt (te vinden in Best Practices: Versiebeheer van gegevenscontract):

  • Het type implementeert de IExtensibleDataObject interface. Zie Forward-Compatible Data Contracts voor meer informatie.

  • Gegevensleden worden geïmplementeerd als openbare eigenschappen die privévelden verpakken.

  • De klasse is een gedeeltelijke klasse en toevoegingen kunnen worden aangebracht zonder gegenereerde code te wijzigen.

Hiermee XsdDataContractExporter kunt u het omgekeerde doen: neem typen die serialiseerbaar zijn met het DataContractSerializer XSD-schemadocument en genereer een XSD-schemadocument.

Fidelity is niet gegarandeerd

Het is niet gegarandeerd dat schema's of typen een retour maken met totale betrouwbaarheid. (Een retour betekent dat u een schema importeert om een reeks klassen te maken en het resultaat te exporteren om een schema opnieuw te maken.) Hetzelfde schema wordt mogelijk niet geretourneerd. Het terugdraaien van het proces is ook niet gegarandeerd om betrouwbaarheid te behouden. (Exporteer een type om het bijbehorende schema te genereren en importeer het type vervolgens terug. Het is onwaarschijnlijk dat hetzelfde type wordt geretourneerd.)

Ondersteunde typen

Het gegevenscontractmodel ondersteunt slechts een beperkte subset van het WC3-schema. Elk schema dat niet aan deze subset voldoet, veroorzaakt een uitzondering tijdens het importproces. Er is bijvoorbeeld geen manier om op te geven dat een gegevenslid van een gegevenscontract moet worden geserialiseerd als een XML-kenmerk. Schema's die het gebruik van XML-kenmerken vereisen, worden dus niet ondersteund en veroorzaken uitzonderingen tijdens het importeren, omdat het onmogelijk is om een gegevenscontract met de juiste XML-projectie te genereren.

Het volgende schemafragment kan bijvoorbeeld niet worden geïmporteerd met behulp van de standaardinstellingen voor importeren.

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

Zie Data Contract Schema Reference voor meer informatie. Als een schema niet voldoet aan de regels voor het gegevenscontract, gebruikt u een andere serialisatie-engine. De toepassing maakt bijvoorbeeld XmlSerializer gebruik van een eigen afzonderlijk mechanisme voor het importeren van schema's. Er is ook een speciale importmodus waarin het bereik van het ondersteunde schema wordt uitgebreid. Zie de sectie over het genereren van IXmlSerializable typen in Het importeren van schema voor het genereren van klassen voor het genereren van klassen voor meer informatie.

De XsdDataContractExporter ondersteunt alle .NET Framework-typen die kunnen worden geserialiseerd met de DataContractSerializer. Zie Typen die worden ondersteund door de Serializer van het gegevenscontract voor meer informatie. Houd er rekening mee dat het schema dat wordt gegenereerd met behulp van de XsdDataContractExporter normaal geldige gegevens is die het XsdDataContractImporter kan gebruiken (tenzij het XmlSchemaProviderAttribute wordt gebruikt om het schema aan te passen).

Zie Schema importeren om klassen te genereren voor meer informatie over het gebruik van het XsdDataContractImporterschema.

Zie Schema's exporteren uit klassen voor meer informatie over het gebruik van deXsdDataContractExporter.

Zie ook