Importación y exportación de esquemas

Windows Communication Foundation (WCF) incluye un motor de serialización nuevo, DataContractSerializer. DataContractSerializer traduce entre los objetos de .NET Framework y XML, en ambas direcciones. Además del propio serializador, WCF incluye la importación del esquema asociado y los mecanismos de exportación de esquema. El esquema es una descripción formal, exacta y legible por la máquina de la forma de XML que el serializador genera o al que puede tener acceso el deserializador. WCF usa el lenguaje de definición de esquemas (XSD) XML de World Wide Web Consortium (W3C) como su representación de esquema, que es muy interoperable con numerosas plataformas de terceros.

El componente de importación de esquema, XsdDataContractImporter, toma un documento de esquema XSD y genera las clases de .NET Framework (por lo general, las clases de contrato de datos) de manera que los formularios serializados se corresponden con el esquema dado.

Por ejemplo, el fragmento de esquema siguiente:

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 el tipo siguiente (simplificado ligeramente para una mejor interpretación).

[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

Observe que el tipo generado sigue varios procedimientos recomendados para el contrato de datos (se encuentran en Procedimientos recomendados: Creación de versiones de contratos de datos):

  • El tipo implementa la interfaz IExtensibleDataObject. Para obtener más información, vea Forward-Compatible Data Contracts (Contratos de datos compatibles con el reenvío).

  • Los miembros de datos se implementan como propiedades públicas que se ajustan a los campos privados.

  • La clase es una clase parcial y se pueden realizar adiciones sin modificar el código generado.

XsdDataContractExporter le permite hacer lo contrario: tomar los tipos que son serializables con DataContractSerializer y generar un documento de esquema XSD.

La fidelidad no está garantizada

No se garantiza que el esquema o los tipos realicen un viaje de ida y vuelta (round trip) con fidelidad total. (Un recorrido de ida y vuelta significa importar un esquema para crear un conjunto de clases y exportar el resultado para crear un esquema nuevamente). Es posible que no se devuelva el mismo esquema. Invertir el proceso no garantiza tampoco conservar la fidelidad. (Exporte un tipo para generar su esquema e importe el tipo de nuevo. Es poco probable que se devuelva el mismo tipo).

Tipos admitidos

El modelo del contrato de datos solo admite un subconjunto limitado del esquema de WC3. Cualquier esquema que no se ajusta a este subconjunto producirá una excepción durante el proceso de importación. Por ejemplo, no hay ninguna manera de especificar que un miembro de datos de un contrato de datos deba serializarse como un atributo XML. Así, los esquemas que requieren el uso de atributos XML no se admiten y producirán excepciones durante la importación ya que es imposible generar un contrato de datos con la proyección de XML correcta.

Por ejemplo, el fragmento del esquema siguiente no se puede importar utilizando los valores de importación predeterminados.

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

Para más información, consulte Referencia de esquema de contrato de datos. Si un esquema no se ajusta a las reglas del contrato de datos, utilice un motor de serialización diferente. Por ejemplo, XmlSerializer utiliza su propio mecanismo de importación de esquema independiente. Además, hay un modo especial de importación en el que se expande el intervalo de esquema compatible. Para más información consulte la sección sobre cómo generar tipos IXmlSerializable en Importación del esquema para generar clases.

XsdDataContractExporter admite cualquier tipo de .NET Framework que se pueda serializar con DataContractSerializer. Para más información, consulte Tipos admitidos por el serializador de contratos de datos. Tenga en cuenta que el esquema generado mediante XsdDataContractExporter son normalmente datos válidos que XsdDataContractImporter puede utilizar (a menos que se use XmlSchemaProviderAttribute para personalizar el esquema).

Para más información sobre cómo usar XsdDataContractImporter, consulte Importación del esquema para generar clases.

Para más información sobre cómo usar XsdDataContractExporter, consulte Exportación de esquemas desde las clases.

Consulte también