Compartir a través de


Importación y exportación de esquemas

Windows Communication Foundation (WCF) incluye un nuevo motor de la serialización, DataContractSerializer. DataContractSerializer traduce entre los objetos .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. Esquema es una descripción formal, precisa y que las máquinas pueden interpretar de la forma de XML que el serializador genera o a la que el deserializador puede tener acceso. WCF utiliza el lenguaje de definición de esquemas XML (XSD) de World Wide Web Consortium (W3C) como la representación del esquema, que puede interoperar ampliamente con numerosas plataformas de otros fabricantes.

El componente de importación de esquema, XsdDataContractImporter, toma un documento de esquema XSD y genera las clases .NET Framework (normalmente 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:

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

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

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 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 viaje de ida y vuelta (round trip) significa importar un esquema para crear un conjunto de clases y exportar el resultado para crear de nuevo un esquema.) 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 y, a continuación, importe el tipo de nuevo. Es improbable 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 obtener más información, vea 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 de importación especial en el que se expande el intervalo de esquema compatible. Para obtener más información, vea la sección sobre cómo generar los tipos de IXmlSerializable en Importación del esquema para generar clases.

XsdDataContractExporter admite cualquier tipo de .NET Framework que pueda serializarse con DataContractSerializer. Para obtener más información, vea Tipos admitidos por el serializador de contrato 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 obtener más información sobre usando XsdDataContractImporter, vea Importación del esquema para generar clases.

Para obtener más información sobre usando XsdDataContractExporter, vea Exportación de esquemas desde las clases.

Vea también

Referencia

DataContractSerializer
XsdDataContractImporter
XsdDataContractExporter

Conceptos

Importación del esquema para generar clases
Exportación de esquemas desde las clases