Compartilhar via


Importação e exportação de esquemas

O WCF (Windows Communication Foundation) inclui um novo mecanismo de serialização, o DataContractSerializer. O DataContractSerializer traduz entre objetos .NET Framework e XML (em ambas as direções). Além do serializador em si, o WCF inclui mecanismos associados de importação de esquema e exportação de esquema. O esquema é uma descrição formal, precisa e legível por computador da forma de XML que o serializador produz ou que o desserializador pode acessar. O WCF usa a linguagem de definição de esquema XML (W3C) do World Wide Web Consortium (XSD) como sua representação de esquema, que é amplamente interoperável com várias plataformas de terceiros.

O componente de importação de esquema usa XsdDataContractImporterum documento de esquema XSD e gera classes do .NET Framework (normalmente classes de contrato de dados) de modo que os formulários serializados correspondam ao esquema especificado.

Por exemplo, o seguinte fragmento de esquema:

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

gera o tipo a seguir (simplificado ligeiramente para melhor legibilidade).

[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 o tipo gerado segue várias práticas recomendadas de contrato de dados (encontradas nas práticas recomendadas: controle de versão do contrato de dados):

  • O tipo implementa a interface IExtensibleDataObject. Para obter mais informações, consulte Forward-Compatible Data Contracts.

  • Os membros de dados são implementados como propriedades públicas que encapsulam campos privados.

  • A classe é uma classe parcial e as adições podem ser feitas sem modificar o código gerado.

O XsdDataContractExporter permite que você faça o inverso—pegue tipos que são serializáveis com o DataContractSerializer e gere um documento de esquema XSD.

A fidelidade não é garantida

Não é garantido que o esquema ou os tipos façam uma viagem de ida e volta com fidelidade total. (Uma viagem de ida e volta significa importar um esquema para criar um conjunto de classes e exportar o resultado para criar um esquema novamente.) O mesmo esquema pode não ser retornado. A reversão do processo também não é garantida para preservar a fidelidade. (Exporte um tipo para gerar seu esquema e importe o tipo de volta. É improvável que o mesmo tipo seja retornado.)

Tipos Suportados

O modelo de contrato de dados dá suporte apenas a um subconjunto limitado do esquema WC3. Qualquer esquema que não esteja em conformidade com esse subconjunto causará uma exceção durante o processo de importação. Por exemplo, não há como especificar que um membro de dados de um contrato de dados deve ser serializado como um atributo XML. Portanto, esquemas que exigem o uso de atributos XML não têm suporte e causarão exceções durante a importação, pois é impossível gerar um contrato de dados com a projeção XML correta.

Por exemplo, o fragmento de esquema a seguir não pode ser importado usando as configurações de importação padrão.

<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 obter mais informações, consulte Referência de esquema de contrato de dados. Se um esquema não estiver em conformidade com as regras de contrato de dados, use um mecanismo de serialização diferente. Por exemplo, o XmlSerializer utiliza seu próprio mecanismo separado de importação de esquema. Além disso, há um modo de importação especial no qual o intervalo de esquema com suporte é expandido. Para saber mais, confira a seção sobre como gerar tipos IXmlSerializable em Importando esquema para gerar classes.

O XsdDataContractExporter oferece suporte a qualquer tipo do .NET Framework que possa ser serializado com o DataContractSerializer. Para obter mais informações, consulte Tipos compatíveis com o Serializador de Contrato de Dados. Observe que o esquema gerado usando o XsdDataContractExporter normalmente é válido e que o XsdDataContractImporter pode usar (a menos que o XmlSchemaProviderAttribute seja usado para personalizar o esquema).

Para obter mais informações sobre o uso do XsdDataContractImporter, consulte Importação de Esquema para Gerar Classes.

Para obter mais informações sobre como usar o XsdDataContractExporter, consulte Esquemas de Exportação de Classes.

Consulte também