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):
Il tipo implementa l'interfaccia IExtensibleDataObject. Per ulteriori informazioni, vedere Contratti dati compatibili con versioni successive.
I membri dati vengono implementati come proprietà pubbliche che incapsulano campi privati.
La classe è una classe parziale e le aggiunte possono essere eseguite senza modificare il codice generato.
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