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