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):
Il tipo implementa l'interfaccia IExtensibleDataObject. Per altre informazioni, vedere Contratti di 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 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.