Importation et exportation de schémas

Windows Communication Foundation (WCF) inclut un nouveau moteur de sérialisation, le DataContractSerializer. Le DataContractSerializer traduit des objets .NET Framework en XML, et inversement. Outre le sérialiseur lui-même, WCF intègre un système lui permettant d’importer et d’exporter les schémas afférents. Un schéma est une description formelle et précise dans un format de type XML, générée par le sérialiseur et accessible au désérialiseur. Cette description peut en outre être lue par un ordinateur. WCF utilise le langage de définition de schéma XML du World Wide Web Consortium (W3C) en tant que représentation de schéma, ce qui est compatible avec de nombreuses plateformes tierces.

L’importateur de schémas, XsdDataContractImporter, utilise un document de schéma XSD pour générer des classes .NET Framework (il s’agit en principe de classes de contrat de données) et faire correspondre les formes sérialisées générées au schéma donné.

Par exemple, le fragment de schéma suivant :

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

génère le type suivant (légèrement simplifié pour permettre une meilleure compréhension).

[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

Remarque : le type est généré conformément à plusieurs meilleures pratiques en matière de contrat de données. (trouvé dans Meilleures pratiques : Contrôle de version des contrats de données) :

L'exportateur XsdDataContractExporter vous permet d'effectuer l'opération inverse, c'est-à-dire de prendre des types pouvant être sérialisés à l'aide de DataContractSerializer, puis de générer un document de schéma XSD.

Fidélité non garantie

Lors de la conversion, puis reconversion des schémas ou types, la stricte fidélité des informations converties n'est pas garantie. (Un aller-retour consiste à importer un schéma afin de créer un ensemble de classes, puis d’exporter le résultat pour recréer le schéma.) Le même schéma ne peut pas être retourné. Effectuer à nouveau le processus dans le sens inverse ne garantit pas en effet la fidélité aux informations d'origine. (Exportez un type pour générer son schéma, puis importez-le. Il est peu probable que le même type soit retourné.)

Types pris en charge

Le modèle de contrat de données prend uniquement en charge un sous-ensemble limité de schémas WC3. Tout schéma ne se conformant pas à ce sous-ensemble provoquera la levée d'une exception lors de l'importation. Par exemple, il n'est pas possible d'indiquer qu'un membre de données d'un contrat de données doit être sérialisé sous forme d'attribut XML. Les schémas nécessitant l'utilisation d'attributs XML ne sont donc pas pris en charge et provoqueront la levée d'exceptions lors de l'importation, le contrat de données ne pouvant être généré à l'aide des attributs XML appropriés.

Par exemple, il est impossible d'importer le fragment de schéma suivant à l'aide des paramètres d'importation par défaut.

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

Pour plus d’informations, consultez Référence des schémas de contrats de données. Lorsqu'un schéma ne se conforme pas aux règles des contrats de données, utilisez un autre moteur de sérialisation. Le moteur de sérialisation XmlSerializer utilise, par exemple, son propre mécanisme d'importation de schéma. De plus, il existe un mode spécial d'importation dans lequel la plage du schéma pris en charge est développée. Pour plus d’informations, consultez la section relative à la génération de types IXmlSerializable dans Importation de schéma pour générer des classes.

L’exportateur XsdDataContractExporter prend en charge tous les types .NET Framework qui peuvent être sérialisés à l’aide du moteur de sérialisation DataContractSerializer. Pour plus d’informations, consultez Types pris en charge par le sérialiseur de contrat de données. Remarque : le schéma généré à l'aide de XsdDataContractExporter contient en principe des données utilisables par l'importateur XsdDataContractImporter, sauf si XmlSchemaProviderAttribute est utilisé afin de personnaliser ce schéma).

Pour plus d’informations sur l’utilisation du schéma XsdDataContractImporter, consultez Importation de schéma pour générer des classes.

Pour plus d’informations sur l’utilisation de l’objet XsdDataContractExporter, consultez Exportation de schémas à partir de classes.

Voir aussi