Partilhar via


Importação e exportação de esquema

O Windows Communication Foundation (WCF) inclui um novo mecanismo de serialização, o DataContractSerializer. O DataContractSerializer traduz entre objetos do .NET Framework e XML (em ambas as direções). Além do serializador em si, o WCF inclui mecanismos associados de importação e exportação de esquema. Esquema é uma descrição formal, precisa e legível por máquina 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 (XSD) do World Wide Web Consortium (W3C) como sua representação de esquema, que é amplamente interoperável com várias plataformas de terceiros.

O componente de importação de esquema, XsdDataContractImporter, usa um 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 fornecido.

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 seguinte tipo (ligeiramente simplificado 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 em Práticas recomendadas: Controle de versão de contrato de dados):

  • O tipo implementa a IExtensibleDataObject interface. Para obter mais informações, consulte Contratos de dados compatíveis com encaminhamento.

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

  • A classe é uma classe parcial, e 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 esquemas ou tipos façam uma viagem de ida e volta com total fidelidade. (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 não pode ser retornado. A reversão do processo também não garante a preservação da fidelidade. (Exporte um tipo para gerar seu esquema e, em seguida, importe o tipo de volta. É improvável que o mesmo tipo seja retornado.)

Tipos suportados

O modelo de contrato de dados suporta apenas 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. Assim, esquemas que exigem o uso de atributos XML não são suportados e causarão exceções durante a importação, porque é 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 usa seu próprio mecanismo de importação de esquema separado. Além disso, há um modo de importação especial no qual o intervalo de esquema suportado é expandido. Para obter mais informações, consulte a seção sobre como gerar IXmlSerializable tipos em Importando esquema para gerar classes.

O XsdDataContractExporter suporta qualquer tipo de .NET Framework que pode ser serializado com o DataContractSerializer. Para obter mais informações, consulte Tipos suportados pelo Data Contract Serializer. Observe que o esquema gerado usando o XsdDataContractExporter é normalmente válido dados que o pode usar (a XsdDataContractImporter menos que o XmlSchemaProviderAttribute é usado para personalizar o esquema).

Para obter mais informações sobre como usar o XsdDataContractImporter, consulte Importando esquema para gerar classes.

Para obter mais informações sobre como usar o XsdDataContractExporter, consulte Exportando esquemas de classes.

Consulte também