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.