Condividi tramite


Importazione ed esportazione dello schema

In Windows Communication Foundation (WCF) è disponibile un nuovo motore di serializzazione, ovvero DataContractSerializer. DataContractSerializer esegue la conversione tra oggetti .NET Framework e XML in entrambe 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 dell'XML prodotto dal serializzatore o a cui il deserializzatore può accedere. Come rappresentazione dello schema, WCF utilizza il linguaggio XSD (XML Schema Definition Language) W3C (World Wide Web Consortium), 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:

<xs:complexType name="Vehicle">
  <xs:sequence>
    <xs:element name="year" type="xs:int" />
    <xs:element name="color" type="xs:string" />
  </xs:sequence>
</xs:complexType>

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

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 
[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;}
    }
}

Si noti che il tipo generato segue varie procedure consigliate per i contratti dati (disponibili in Procedure consigliate: controllo delle versioni del contratto 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 ulteriori informazioni, vedere Riferimento allo schema del 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 ulteriori informazioni, vedere la sezione relativa alla generazione dei tipi IXmlSerializable in Importazione dello schema per generare classi.

La classe XsdDataContractExporter supporta tutti i tipi .NET Framework che possono essere serializzati con DataContractSerializer. Per ulteriori informazioni, vedere Tipi supportati dal serializzatore dei contratti 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 ulteriori informazioni su sull'utilizzo della classe XsdDataContractImporter, vedere Importazione dello schema per generare classi.

Per ulteriori informazioni su sull'utilizzo della classe XsdDataContractExporter, vedere Esportazione di schemi dalle classi.

Vedere anche

Riferimento

DataContractSerializer
XsdDataContractImporter
XsdDataContractExporter

Concetti

Importazione dello schema per generare classi
Esportazione di schemi dalle classi