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.