Importazione ed esportazione degli schemi

Windows Communication Foundation (WCF) include un nuovo motore di serializzazione, DataContractSerializer. DataContractSerializer esegue la conversione tra oggetti .NET Framework e XML in entrambe le direzioni. Oltre al serializzatore, in WCF sono inoltre inclusi meccanismi di importazione ed esportazione degli schemi associati. Uno schema è una descrizione formale, precisa e leggibile dal computer della forma del codice XML prodotto dal serializzatore o a cui il deserializzatore può accedere. In WCF viene usato il linguaggio XSD (XML Schema Definition Language) W3C (World Wide Web Consortium) come rappresentazione dello schema, che è ampiamente interoperabile con numerose piattaforme di terze parti.

Il componente per l'importazione dello schema, XsdDataContractImporter, considera un documento dello schema XSD e genera classi .NET Framework (generalmente classi del contratto dati) in modo che i formati serializzati corrispondano al determinato schema.

Si consideri ad esempio il frammento di schema seguente:

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

genera il tipo seguente (leggermente semplificato per una migliore leggibilità)

[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

Si noti che il tipo generato segue diverse procedure consigliate per il contratto dati (disponibili in Procedure consigliate: Controllo delle versioni del contratto di dati):

La classe XsdDataContractExporter consente di eseguire l'inverso, ovvero considera i tipi serializzabili con DataContractSerializer e genera un documento dello schema XSD.

Fedeltà non garantita

Non è garantito che lo schema o i tipi eseguano un round trip con fedeltà assoluta (per round trip si intende l'importazione di uno schema per creare un set di classi e l'esportazione del risultato per creare nuovamente uno schema). È possibile che non venga restituito lo stesso schema. Anche per l'inversione del processo non è garantito il mantenimento della fedeltà (quando si esporta un tipo per generare lo schema e quindi si importa di nuovo il tipo, è improbabile che venga restituito lo stesso tipo).

Tipi supportati

Il modello del contratto dati supporta solo un sottoinsieme limitato dello schema WC3. Qualsiasi schema che non è conforme a tale sottoinsieme genererà un'eccezione durante il processo di importazione. Ad esempio, non esiste alcun sistema per specificare che un membro dati di un contratto dati debba essere serializzato come attributo XML. Di conseguenza, gli schemi che richiedono l'utilizzo di attributi XML non sono supportati e verranno generate eccezioni durante l'importazione, poiché è impossibile generare un contratto dati con la proiezione XML corretta.

Ad esempio, non è possibile importare il frammento di schema seguente utilizzando le impostazioni di importazione predefinite.

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

Per altre informazioni, vedere Riferimento dello schema di contratto dati. Se un schema non è conforme alle regole del contratto dati, utilizzare un motore di serializzazione diverso. Ad esempio, la classe XmlSerializer utilizza un proprio meccanismo separato di importazione dello schema. È inoltre disponibile una modalità di importazione speciale in cui l'intervallo dello schema supportato viene espanso. Per altre informazioni, vedere la sezione relativa alla generazione di tipi di IXmlSerializable in Importazione dello schema per generare classi.

La classe XsdDataContractExporter supporta tutti i tipi di .NET Framework che possono essere serializzati con DataContractSerializer. Per altre informazioni, vedere Tipi supportati dal serializzatore dei contratti di dati. Si noti che lo schema generato utilizzando XsdDataContractExporter consiste solitamente di dati validi che possono essere utilizzati da XsdDataContractImporter, a meno che non si utilizzi la classe XmlSchemaProviderAttribute per personalizzare lo schema.

Per altre informazioni sull'uso di XsdDataContractImporter, vedere Importazione dello schema per generare classi.

Per altre informazioni sull'uso di XsdDataContractExporter, vedere Esportazione di schemi da classi.

Vedi anche