Importação e exportação de esquemas
O WCF (Windows Communication Foundation) inclui um novo mecanismo de serialização, o DataContractSerializer. O DataContractSerializer
converte 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 e exportação de esquema. OEsquema é uma descrição formal, precisa e legível por máquina da forma do XML que o serializador produz ou que o desserializador pode acessar. O WCF usa a XSD (linguagem de definição de esquema XML) do W3C (World Wide Web Consortium) 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 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 do contrato de dados (encontradas em Práticas recomendadas: controle de versão do contrato de dados):
O tipo implementa a interface IExtensibleDataObject. Para obter mais informações, consulte Contratos de dados compatíveis por encaminhamento.
Os membros de dados são implementados como propriedades públicas que encapsulam campos privados.
A classe é uma classe parcial; as adições podem ser feitas sem modificar o código gerado.
O XsdDataContractExporter permite que você faça o contrário, usar tipos serializáveis com o DataContractSerializer
e gerar 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 poderá não ser retornado. A reversão do processo também não é garantia de preservação da fidelidade. (Exportar um tipo para gerar seu esquema e importar o tipo de volta. É improvável que o mesmo tipo seja retornado.)
Tipos com suporte
O modelo de contrato de dados dá suporte apenas a um subconjunto limitado do esquema WC3. Os esquemas que não estiverem em conformidade com esse subconjunto causarão 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 com 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 saber mais, confira Referência de esquema de contrato de dados. Se um esquema não estiver em conformidade com as regras do 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 com suporte é expandido. Para saber mais, confira a seção sobre como gerar tipos IXmlSerializable em Importando esquema para gerar classes.
O XsdDataContractExporter
dá suporte a qualquer tipo de .NET Framework que possa ser serializado com o DataContractSerializer
. Para saber mais, confira Tipos compatíveis com o Serializador de Contrato de Dados. Observe que o esquema gerado usando o XsdDataContractExporter
é normalmente feito de dados válidos que o XsdDataContractImporter
pode usar (a menos que XmlSchemaProviderAttribute seja usado para personalizar o esquema).
Para saber mais sobre como usar o XsdDataContractImporter, confira Importando esquema para gerar classes.
Para saber mais sobre como usar o XsdDataContractExporter, confira Exportando esquemas de classes.