Tipos XML e ADO.NET em contratos de dados
O modelo de contrato de dados do Windows Communication Foundation (WCF) oferece suporte a determinados tipos que representam XML diretamente. Quando esses tipos são serializados em XML, o serializador grava o conteúdo XML desses tipos sem qualquer processamento adicional. Os tipos suportados são XmlElement, matrizes de XmlNode (mas não o XmlNode
tipo em si), bem como tipos que implementam IXmlSerializable. O DataSet e DataTable type, bem como conjuntos de dados tipados, são comumente usados na programação de banco de dados. Esses tipos implementam a IXmlSerializable
interface e, portanto, são serializáveis no modelo de contrato de dados. Algumas considerações especiais para esses tipos estão listadas no final deste tópico.
Tipos XML
Elemento Xml
O XmlElement
tipo é serializado usando seu conteúdo XML. Por exemplo, usando o seguinte tipo.
[DataContract(Namespace=@"http://schemas.contoso.com")]
public class MyDataContract
{
[DataMember]
public XmlElement myDataMember;
public void TestClass()
{
XmlDocument xd = new XmlDocument();
myDataMember = xd.CreateElement("myElement");
myDataMember.InnerText = "myContents";
myDataMember.SetAttribute
("myAttribute","myValue");
}
}
<DataContract([Namespace]:="http://schemas.contoso.com")> _
Public Class MyDataContract
<DataMember()> _
Public myDataMember As XmlElement
Public Sub TestClass()
Dim xd As New XmlDocument()
myDataMember = xd.CreateElement("myElement")
myDataMember.InnerText = "myContents"
myDataMember.SetAttribute("myAttribute", "myValue")
End Sub
End Class
Isso é serializado para XML da seguinte maneira:
<MyDataContract xmlns="http://schemas.contoso.com">
<myDataMember>
<myElement xmlns="" myAttribute="myValue">
myContents
</myElement>
</myDataMember>
</MyDataContract>
Observe que um elemento <myDataMember>
de membro de dados do wrapper ainda está presente. Não é possível remover esse elemento no modelo de contrato de dados. Os serializadores que manipulam esse modelo (o DataContractSerializer e NetDataContractSerializer) podem emitir atributos especiais para esse elemento wrapper. Esses atributos incluem o atributo "nil" padrão da instância do esquema XML (permitindo que o XmlElement
seja null
) e o atributo "type" (permitindo XmlElement
ser usado polimorficamente). Além disso, os seguintes atributos XML são específicos do WCF: "Id", "Ref", "Type" e "Assembly". Esses atributos podem ser emitidos para suportar o uso do XmlElement
com o modo de preservação do gráfico de objetos habilitado ou com o NetDataContractSerializer. (Para obter mais informações sobre o modo de preservação do gráfico de objetos, consulte Serialização e Desserialização.)
Matrizes ou coleções de XmlElement
são permitidas e são tratadas como qualquer outra matriz ou coleção. Ou seja, há um elemento wrapper para toda a coleção e um elemento wrapper separado (semelhante ao <myDataMember>
exemplo anterior) para cada XmlElement
um na matriz.
Na desserialização, um XmlElement
é criado pelo desserializador a partir do XML de entrada. Um pai XmlDocument válido é fornecido pelo desserializador.
Certifique-se de que o fragmento XML que é desserializado para um XmlElement
define todos os prefixos que ele usa e não depende de nenhuma definição de prefixo de elementos ancestrais. Esta é uma preocupação apenas ao usar o para acessar XML DataContractSerializer
de uma fonte diferente (não-DataContractSerializer
).
Quando usado com o DataContractSerializer
, o XmlElement
pode ser atribuído polimorficamente, mas apenas a um membro de dados do tipo Object. Embora implemente o , um XmlElement
não pode ser usado como um tipo de coleção e não pode ser atribuído a um IEnumerable membro de IEnumerabledados. Como em todas as atribuições polimórficas, o DataContractSerializer
emite o nome do contrato de dados no XML resultante. Nesse caso, é "XmlElement" no http://schemas.datacontract.org/2004/07/System.Xml
namespace.
Com o NetDataContractSerializer
, qualquer atribuição polimórfica válida de XmlElement
(para Object
ou IEnumerable
) é suportada.
Não tente usar nenhum dos serializadores com tipos derivados de XmlElement
, quer eles sejam atribuídos polimorficamente ou não.
Matriz de XmlNode
Usar matrizes de é muito semelhante ao uso XmlElement
de XmlNode . O uso de arrays de oferece mais flexibilidade do que o uso XmlElement
do XmlNode
. Você pode escrever vários elementos dentro do elemento de encapsulamento de membro de dados. Você também pode injetar conteúdo diferente de elementos dentro do elemento de encapsulamento do membro de dados, como comentários XML. Finalmente, você pode colocar atributos no elemento de membro de dados de encapsulamento. Tudo isso pode ser alcançado preenchendo a matriz de XmlNode
com classes derivadas específicas de XmlNode
como XmlAttribute, XmlElement
ou XmlComment. Por exemplo, usando o seguinte tipo.
[DataContract(Namespace="http://schemas.contoso.com")]
public class MyDataContract
{
[DataMember]
public XmlNode[] myDataMember = new XmlNode[4];
public void TestClass()
{
XmlDocument xd = new XmlDocument();
XmlElement xe = xd.CreateElement("myElement");
xe.InnerText = "myContents";
xe.SetAttribute
("myAttribute","myValue");
XmlAttribute atr = xe.Attributes[0];
XmlComment cmnt = xd.CreateComment("myComment");
myDataMember[0] = atr;
myDataMember[1] = cmnt;
myDataMember[2] = xe;
myDataMember[3] = xe;
}
}
<DataContract([Namespace]:="http://schemas.contoso.com")> _
Public Class MyDataContract
<DataMember()> _
Public myDataMember(3) As XmlNode
Public Sub TestClass()
Dim xd As New XmlDocument()
Dim xe As XmlElement = xd.CreateElement("myElement")
xe.InnerText = "myContents"
xe.SetAttribute("myAttribute", "myValue")
Dim atr As XmlAttribute = xe.Attributes(0)
Dim cmnt As XmlComment = xd.CreateComment("myComment")
myDataMember(0) = atr
myDataMember(1) = cmnt
myDataMember(2) = xe
myDataMember(3) = xe
End Sub
End Class
Quando serializado, o XML resultante é semelhante ao código a seguir.
<MyDataContract xmlns="http://schemas.contoso.com">
<myDataMember myAttribute="myValue">
<!--myComment-->
<myElement xmlns="" myAttribute="myValue">
myContents
</myElement>
<myElement xmlns="" myAttribute="myValue">
myContents
</myElement>
</myDataMember>
</MyDataContract>
Observe que o elemento <myDataMember>
wrapper de membro de dados contém um atributo, um comentário e dois elementos. Estas são as quatro XmlNode
instâncias que foram serializadas.
Uma matriz que XmlNode
resulta em XML inválido não pode ser serializada. Por exemplo, uma matriz de duas XmlNode
instâncias em que a primeira é uma XmlElement
e a segunda é uma é inválida XmlAttribute , porque essa sequência não corresponde a nenhuma instância XML válida (não há lugar para anexar o atributo).
Na desserialização de uma matriz de nós , os nós são criados e preenchidos XmlNode
com informações do XML de entrada. Um pai XmlDocument válido é fornecido pelo desserializador. Todos os nós são desserializados, incluindo quaisquer atributos no elemento de membro de dados do wrapper, mas excluindo os atributos colocados lá pelos serializadores WCF (como os atributos usados para indicar a atribuição polimórfica). A ressalva sobre a definição de todos os prefixos de namespace no fragmento XML aplica-se à desserialização de matrizes da XmlNode
mesma forma que se aplica à desserialização XmlElement
.
Ao usar os serializadores com a preservação de gráficos de objetos ativada, a igualdade de objetos é preservada apenas no nível de XmlNode
matrizes, não em instâncias individuais XmlNode
.
Não tente serializar uma matriz de XmlNode
onde um ou mais dos nós está definido como null
. É permitido que todo o membro da matriz seja null
, mas não para qualquer indivíduo XmlNode
contido na matriz. Se todo o membro da matriz for null, o elemento wrapper data member conterá um atributo especial que indica que ele é null. Na desserialização, todo o membro da matriz também se torna nulo.
Apenas matrizes regulares de XmlNode
são tratadas especialmente pelo serializador. Os membros de dados declarados como outros tipos de coleta que contêm XmlNode
, ou os membros de dados declarados como matrizes de tipos derivados de XmlNode
, não são tratados especialmente. Assim, eles normalmente não são serializáveis, a menos que também atendam a um dos outros critérios para serialização.
Matrizes ou coleções de matrizes de XmlNode
são permitidas. Há um elemento wrapper para toda a coleção e um elemento wrapper separado (semelhante ao <myDataMember>
exemplo anterior) para cada array de XmlNode
na matriz externa ou coleção.
O preenchimento de um membro de dados do tipo Array de Object
ou Array
de IEnumerable
com XmlNode
instâncias não resulta no tratamento do membro de dados como uma Array
das XmlNode
instâncias. Cada membro da matriz é serializado separadamente.
Quando usado com o DataContractSerializer
, matrizes de XmlNode
podem ser atribuídas polimorficamente, mas apenas a um membro de dados do tipo Object
. Embora implemente IEnumerable
o , uma matriz de não pode ser usada como um tipo de coleção e ser atribuída a um IEnumerable
membro de XmlNode
dados. Como em todas as atribuições polimórficas, o DataContractSerializer
emite o nome do contrato de dados no XML resultante – neste caso, é "ArrayOfXmlNode" no http://schemas.datacontract.org/2004/07/System.Xml
namespace. Quando usado com o NetDataContractSerializer
, qualquer atribuição válida de uma XmlNode
matriz é suportada.
Considerações sobre o esquema
Para obter detalhes sobre o mapeamento de esquema de tipos XML, consulte Referência de esquema de contrato de dados. Esta secção fornece um resumo dos pontos importantes.
Um membro de dados do tipo XmlElement
é mapeado para um elemento definido usando o seguinte tipo anônimo.
<xsd:complexType>
<xsd:sequence>
<xsd:any minOccurs="0" processContents="lax" />
</xsd:sequence>
</xsd:complexType>
Um membro de dados do tipo Array of é mapeado XmlNode
para um elemento definido usando o seguinte tipo anônimo.
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax" />
</xsd:sequence>
<xsd:anyAttribute/>
</xsd:complexType>
Tipos implementando a interface IXmlSerializable
Os tipos que implementam a IXmlSerializable
interface são totalmente suportados DataContractSerializer
pelo . O XmlSchemaProviderAttribute atributo deve sempre ser aplicado a esses tipos para controlar seu esquema.
Há três variedades de tipos que implementam IXmlSerializable
: tipos que representam conteúdo arbitrário, tipos que representam um único elemento e tipos herdados DataSet .
Os tipos de conteúdo usam um método de provedor de esquema especificado pelo
XmlSchemaProviderAttribute
atributo. O método não retornanull
e a IsAny propriedade no atributo é deixada em seu valor padrão defalse
. Este é o uso mais comum deIXmlSerializable
tipos.Os tipos de elemento são usados quando um tipo deve controlar seu próprio nome de
IXmlSerializable
elemento raiz. Para marcar um tipo como um tipo de elemento, defina a IsAnyXmlSchemaProviderAttribute propriedade no atributo comotrue
ou retorne null do método do provedor de esquema. Ter um método de provedor de esquema é opcional para tipos de elemento – você pode especificar null em vez do nome do método noXmlSchemaProviderAttribute
. No entanto, seIsAny
étrue
e um método de provedor de esquema é especificado, o método deve retornar null.Tipos herdados DataSet são
IXmlSerializable
tipos que não são marcados com oXmlSchemaProviderAttribute
atributo. Em vez disso, eles dependem do método para a geração do GetSchema esquema. Esse padrão é usado para oDataSet
tipo e seu conjunto de dados tipado deriva uma classe em versões anteriores do .NET Framework, mas agora está obsoleto e é suportado apenas por motivos herdados. Não confie neste padrão e aplique sempre oXmlSchemaProviderAttribute
aos seusIXmlSerializable
tipos.
Tipos de conteúdo IXmlSerializable
Ao serializar um membro de dados de um tipo que implementa e é um tipo de IXmlSerializable
conteúdo conforme definido anteriormente, o serializador grava o elemento wrapper para o membro de dados e passa o controle para o WriteXml método. A WriteXml implementação pode escrever qualquer XML, incluindo a adição de atributos ao elemento wrapper. Depois WriteXml
de concluído, o serializador fecha o elemento.
Ao desserializar um membro de dados de um tipo que implementa e é um tipo de IXmlSerializable
conteúdo conforme definido anteriormente, o desserializador posiciona o leitor XML no elemento wrapper para o membro de dados e passa o controle para o ReadXml método. O método deve ler o elemento inteiro, incluindo as tags start e end. Certifique-se de que seu ReadXml
código lida com o caso em que o elemento está vazio. Além disso, sua ReadXml
implementação não deve depender do elemento wrapper ser nomeado de uma maneira específica. O nome escolhido pelo serializador pode variar.
É permitido atribuir IXmlSerializable
tipos de conteúdo polimorficamente, por exemplo, a membros de dados do tipo Object. Também é permitido que as instâncias de tipo sejam nulas. Finalmente, é possível usar IXmlSerializable
tipos com a preservação de gráficos de objetos ativada e com o NetDataContractSerializer. Todos esses recursos exigem que o serializador WCF anexe certos atributos ao elemento wrapper ("nil" e "type" no namespace XML Schema Instance e "Id", "Ref", "Type" e "Assembly" em um namespace específico do WCF).
Atributos a serem ignorados ao implementar o ReadXml
Antes de passar o controle para o ReadXml
código, o desserializador examina o elemento XML, deteta esses atributos XML especiais e age sobre eles. Por exemplo, se "nil" for true
, um valor nulo será desserializado e ReadXml
não será chamado. Se o polimorfismo for detetado, o conteúdo do elemento será desserializado como se fosse um tipo diferente. A implementação do ReadXml
tipo atribuído polimorficamente é chamada. Em qualquer caso, uma ReadXml
implementação deve ignorar esses atributos especiais porque eles são manipulados pelo desserializador.
Considerações de esquema para tipos de conteúdo IXmlSerializable
Ao exportar um IXmlSerializable
tipo de conteúdo de esquema, o método do provedor de esquema é chamado. Um XmlSchemaSet é passado para o método do provedor de esquema. O método pode adicionar qualquer esquema válido ao conjunto de esquemas. O conjunto de esquemas contém o esquema que já é conhecido no momento em que ocorre a exportação do esquema. Quando o método do provedor de esquema deve adicionar um item ao conjunto de esquemas, ele deve determinar se um XmlSchema com o namespace apropriado já existe no conjunto. Se isso acontecer, o método do provedor de esquema deve adicionar o novo item ao arquivo XmlSchema
. Caso contrário, ele deve criar uma nova XmlSchema
instância. Isso é importante se matrizes de IXmlSerializable
tipos estiverem sendo usadas. Por exemplo, se você tiver um IXmlSerializable
tipo que é exportado como tipo "A" no namespace "B", é possível que, no momento em que o método do provedor de esquema é chamado, o conjunto de esquemas já contenha o esquema para "B" para conter o tipo "ArrayOfA".
Além de adicionar tipos ao XmlSchemaSet, o método do provedor de esquema para tipos de conteúdo deve retornar um valor não nulo. Ele pode retornar um XmlQualifiedName que especifica o nome do tipo de esquema a ser usado para determinado IXmlSerializable
tipo. Esse nome qualificado também serve como o nome do contrato de dados e namespace para o tipo. É permitido retornar um tipo que não existe no conjunto de esquemas imediatamente quando o método do provedor de esquema retorna. No entanto, espera-se que, no momento em que todos os tipos relacionados são exportados (o Export método é chamado para todos os tipos relevantes no e a XsdDataContractExporterSchemas propriedade é acessada), o tipo existe no conjunto de esquemas. O acesso à propriedade antes de Schemas
todas as chamadas relevantes Export
terem sido feitas pode resultar em um XmlSchemaExceptionarquivo . Para obter mais informações sobre o processo de exportação, consulte Exportando esquemas de classes.
O método do provedor de esquema também pode retornar o XmlSchemaType para usar. O tipo pode ou não ser anónimo. Se for anônimo, o esquema do tipo será exportado IXmlSerializable
como um tipo anônimo toda vez que o IXmlSerializable
tipo for usado como membro de dados. O IXmlSerializable
tipo ainda tem um nome de contrato de dados e namespace. (Isto é determinado conforme descrito em Nomes de Contrato de Dados, exceto que o DataContractAttribute atributo não pode ser usado para personalizar o nome.) Se não for anónimo, deve ser um dos tipos no XmlSchemaSet
. Este caso equivale a devolver o XmlQualifiedName
do tipo.
Além disso, uma declaração de elemento global é exportada para o tipo. Se o tipo não tiver o XmlRootAttribute atributo aplicado a ele, o elemento terá o mesmo nome e namespace que o contrato de dados, e sua propriedade "nillable" será true
. A única exceção a isso é o namespace do esquema (http://www.w3.org/2001/XMLSchema
); se o contrato de dados do tipo estiver nesse namespace, o elemento global correspondente estará no namespace em branco porque é proibido adicionar novos elementos ao namespace do esquema. Se o tipo tiver o XmlRootAttribute
atributo aplicado a ele, a declaração de elemento global será exportada usando as seguintes propriedades: ElementName, Namespacee IsNullable. Os padrões com XmlRootAttribute
aplicado são o nome do contrato de dados, um namespace em branco e "nillable" sendo true.
As mesmas regras de declaração de elemento global se aplicam a tipos de conjuntos de dados herdados. Observe que o XmlRootAttribute
não pode substituir declarações de elemento global adicionadas por meio de código personalizado, adicionado ao XmlSchemaSet
usando o método de provedor de esquema ou através de tipos de GetSchema
conjunto de dados herdados.
Tipos de elementos IXmlSerializable
IXmlSerializable
Os tipos de elemento têm a IsAny
propriedade definida como true
ou têm seu método de provedor de esquema retornado null
.
Serializar e desserializar um tipo de elemento é muito semelhante a serializar e desserializar um tipo de conteúdo. No entanto, existem algumas diferenças importantes:
Espera-se que a
WriteXml
implementação escreva exatamente um elemento (que pode, é claro, conter vários elementos filho). Não deve escrever atributos fora deste único elemento, vários elementos irmãos ou conteúdo misto. O elemento pode estar vazio.A
ReadXml
implementação não deve ler o elemento wrapper. Espera-se que leia o único elemento queWriteXml
produz.Ao serializar um tipo de elemento regularmente (por exemplo, como um membro de dados em um contrato de dados), o serializador produz um elemento wrapper antes de chamar
WriteXml
, como acontece com os tipos de conteúdo. No entanto, ao serializar um tipo de elemento no nível superior, o serializador normalmente não produz um elemento wrapper em torno do elemento que escreve, a menos queWriteXml
um nome de raiz e namespace foram explicitamente especificados ao construir oDataContractSerializer
serializador nos construtores orNetDataContractSerializer
. Para obter mais informações, consulte Serialização e desserialização.Ao serializar um tipo de elemento no nível superior sem especificar o nome da raiz e namespace no momento da construção, WriteStartObject e WriteEndObject essencialmente não faz nada e WriteObjectContent chama
WriteXml
. Nesse modo, o objeto que está sendo serializado não pode ser nulo e não pode ser atribuído polimorficamente. Além disso, a preservação do gráfico de objeto não pode ser ativada e oNetDataContractSerializer
não pode ser usado.Ao desserializar um tipo de elemento no nível superior sem especificar o nome da raiz e o namespace no momento da construção, IsStartObject retorna
true
se puder encontrar o início de qualquer elemento. ReadObject com overifyObjectName
parâmetro definido paratrue
se comportar da mesma maneira queIsStartObject
antes de realmente ler o objeto.ReadObject
em seguida, passa o controle para oReadXml
método.
O esquema exportado para tipos de elemento é o mesmo que para o XmlElement
tipo descrito em uma seção anterior, exceto que o método de provedor de esquema pode adicionar qualquer esquema adicional ao XmlSchemaSet como com tipos de conteúdo. O uso do atributo com tipos de XmlRootAttribute
elemento não é permitido, e declarações de elemento global nunca são emitidas para esses tipos.
Diferenças do XmlSerializer
A IXmlSerializable
interface e os XmlSchemaProviderAttribute
atributos e XmlRootAttribute
também são compreendidos XmlSerializer pelo . No entanto, existem algumas diferenças na forma como estes são tratados no modelo de contrato de dados. As diferenças importantes são resumidas da seguinte forma:
O método do provedor de esquema deve ser público para ser utilizável no
XmlSerializer
, mas não precisa ser público para ser utilizável no modelo de contrato de dados.O método do provedor de esquema é chamado quando
IsAny
é true no modelo de contrato de dados, mas não com oXmlSerializer
.Quando o
XmlRootAttribute
atributo não está presente para tipos de conteúdo ou conjunto de dados herdados, o exportaXmlSerializer
uma declaração de elemento global no namespace em branco. No modelo de contrato de dados, o namespace usado normalmente é o namespace do contrato de dados, conforme descrito anteriormente.
Esteja ciente dessas diferenças ao criar tipos que são usados com ambas as tecnologias de serialização.
Importando esquema IXmlSerializable
Ao importar um esquema gerado a partir de IXmlSerializable
tipos, existem algumas possibilidades:
O esquema gerado pode ser um esquema de contrato de dados válido, conforme descrito em Referência de esquema de contrato de dados. Nesse caso, o esquema pode ser importado como de costume e tipos de contrato de dados regulares são gerados.
O esquema gerado pode não ser um esquema de contrato de dados válido. Por exemplo, seu método de provedor de esquema pode gerar esquema que envolve atributos XML que não são suportados no modelo de contrato de dados. Nesse caso, você pode importar o esquema como
IXmlSerializable
tipos. Esse modo de importação não está ativado por padrão, mas pode ser facilmente habilitado – por exemplo, com a opção de/importXmlTypes
linha de comando para a ServiceModel Metadata Utility Tool (Svcutil.exe). Isso é descrito em detalhes no esquema de importação para gerar classes. Observe que você deve trabalhar diretamente com o XML para suas instâncias de tipo. Você também pode considerar o uso de uma tecnologia de serialização diferente que ofereça suporte a uma gama mais ampla de esquema – consulte o tópico sobre como usar oXmlSerializer
.Você pode querer reutilizar seus tipos existentes
IXmlSerializable
no proxy em vez de gerar novos. Nesse caso, o recurso de tipos referenciados descrito no tópico Importando esquema para gerar tipos pode ser usado para indicar o tipo a ser reutilizado. Isso corresponde ao uso do/reference
svcutil.exe de ativação, que especifica o assembly que contém os tipos a serem reutilizados.
Representando XML arbitrário em contratos de dados
O XmlElement
, Array of e IXmlSerializable
types permitem que você injete XML arbitrário no modelo de contrato de XmlNode
dados. O DataContractSerializer
e NetDataContractSerializer
passar esse conteúdo XML para o gravador XML em uso, sem interferir no processo. No entanto, os gravadores XML podem impor certas restrições sobre o XML que eles escrevem. Especificamente, aqui estão alguns exemplos importantes:
Os gravadores XML normalmente não permitem uma declaração de documento XML (por exemplo, <?xml version='1.0' ?>) no meio da escrita de outro documento. Não é possível pegar um documento XML completo e serializá-lo como um
Array
membro deXmlNode
dados. Para fazer isso, você tem que remover a declaração do documento ou usar seu próprio esquema de codificação para representá-lo.Todos os gravadores XML fornecidos com WCF rejeitam instruções de processamento XML (<? ... ?>) e definições de tipo de documento (<! ... ), >porque eles não são permitidos em mensagens SOAP. Novamente, você pode usar seu próprio mecanismo de codificação para contornar essa restrição. Se você precisar incluí-los em seu XML resultante, poderá escrever um codificador personalizado que use gravadores XML que os suportem.
Ao implementar
WriteXml
o , evite chamar WriteRaw o método no gravador XML. WCF usa uma variedade de codificações XML (incluindo binário), é muito difícil ou impossível de usarWriteRaw
de tal forma que o resultado é utilizável em qualquer codificação.Ao implementar
WriteXml
o , evite usar os WriteEntityRef métodos e WriteNmToken que não são suportados nos gravadores XML fornecidos com o WCF.
Usando DataSet, DataSet Tipado e DataTable
O uso desses tipos é totalmente suportado no modelo de contrato de dados. Ao usar esses tipos, considere os seguintes pontos:
O esquema para esses tipos (especialmente DataSet e suas classes derivadas tipadas) pode não ser interoperável com algumas plataformas não-WCF ou pode resultar em baixa usabilidade quando usado com essas plataformas. Além disso, o uso do
DataSet
tipo pode ter implicações de desempenho. Finalmente, pode tornar mais difícil para você fazer a versão do seu aplicativo no futuro. Considere o uso de tipos de contrato de dados explicitamente definidos em vez deDataSet
tipos em seus contratos.Ao importar
DataSet
ouDataTable
esquema, é importante fazer referência a esses tipos. Com a ferramenta de linha de comando Svcutil.exe, isso pode ser feito passando o nome do assembly System.Data.dll para o/reference
switch. Ao importar esquema de conjunto de dados tipado, você deve fazer referência ao tipo do conjunto de dados tipado. Com Svcutil.exe, passe o local da montagem do conjunto de dados digitado para o/reference
switch. Para obter mais informações sobre tipos de referência, consulte Importando esquema para gerar classes.
O suporte para DataSets tipados no modelo de contrato de dados é limitado. DataSets tipados podem ser serializados e desserializados e podem exportar seu esquema. No entanto, a importação de esquema de Contrato de Dados não consegue gerar novos tipos de DataSet tipados a partir do esquema, pois só pode reutilizar os existentes. Você pode apontar para um DataSet digitado existente usando a /r
opção Svcutil.exe. Se você tentar usar um Svcutil.exe sem a /r
opção em um serviço que usa um conjunto de dados tipado, um serializador alternativo (XmlSerializer) será selecionado automaticamente. Se você deve usar o DataContractSerializer e deve gerar DataSets a partir do esquema, você pode usar o seguinte procedimento: gerar os tipos de DataSet tipados (usando a ferramenta Xsd.exe com a /d
opção no serviço), compilar os tipos e, em seguida, apontar para eles usando o /r
switch on Svcutil.exe.