Compartilhar via


Classe System.Runtime.Serialization.DataContractAttribute

Este artigo fornece comentários complementares à documentação de referência para esta API.

Aplique o atributo DataContractAttribute aos tipos (classes, estruturas ou enumerações) que são usados em operações de serialização e desserialização pelo DataContractSerializer. Se você enviar ou receber mensagens usando a infraestrutura do WCF (Fundação de Comunicação do Windows), também deverá aplicar o elemento DataContractAttribute a qualquer classe que contenha e manipule dados enviados nas mensagens. Para obter mais informações sobre contratos de dados, confira Como usar contratos de dados.

Você também deve aplicar o DataMemberAttribute a qualquer campo, propriedade ou evento que contenha valores que você deseja serializar. Ao aplicar o DataContractAttribute, você habilita explicitamente a DataContractSerializer para serializar e desserializar os dados.

Cuidado

Você pode aplicar o DataMemberAttribute a campos privados. Lembre-se de que os dados retornados pelo campo (mesmo que sejam privados) são serializados e desserializados e, portanto, podem ser exibidos ou interceptados por um usuário ou processo mal-intencionado.

Para obter mais informações sobre contratos de dados, consulte os tópicos listados no Uso de Contratos de Dados.

Contratos de dados

Um contrato de dados é uma descrição abstrata de um conjunto de campos com um nome e um tipo de dados para cada campo. O contrato de dados existe fora de qualquer implementação única para permitir que serviços em diferentes plataformas interoperem. Desde que os dados passados entre os serviços estejam em conformidade com o mesmo contrato, todos os serviços poderão processar os dados. Esse processamento também é conhecido como um sistema flexívelmente acoplado. Um contrato de dados também é semelhante a uma interface na qual o contrato especifica como os dados devem ser entregues para que possam ser processados por um aplicativo. Por exemplo, o contrato de dados pode chamar um tipo de dados chamado "Pessoa" que tem dois campos de texto, chamados "FirstName" e "LastName". Para criar um contrato de dados, aplique-o DataContractAttribute à classe e aplique-o DataMemberAttribute a quaisquer campos ou propriedades que devem ser serializadas. Quando serializados, os dados estão em conformidade com o contrato de dados inserido implicitamente no tipo.

Observação

Um contrato de dados difere significativamente de uma interface real em seu comportamento de herança. As interfaces são herdadas por todos os tipos derivados. Quando você aplica a DataContractAttribute uma classe base, os tipos derivados não herdam o atributo ou o comportamento. No entanto, se um tipo derivado tiver um contrato de dados, os membros de dados da classe base serão serializados. No entanto, você deve aplicar DataMemberAttribute a novos membros em uma classe derivada para torná-los serializáveis.

Documentos de esquema XML e a ferramenta SvcUtil

Se você estiver trocando dados com outros serviços, deverá descrever o contrato de dados. Para a versão atual do DataContractSerializer, um esquema XML pode ser usado para definir contratos de dados. (Outras formas de metadados/descrição podem ser usadas para a mesma finalidade.) Para criar um esquema XML do seu aplicativo, use a Ferramenta de Utilitário de Metadados do ServiceModel (Svcutil.exe) com a opção de linha de comando /dconly . Quando a entrada para a ferramenta é um assembly, por padrão, a ferramenta gera um conjunto de esquemas XML que definem todos os tipos de contrato de dados encontrados nesse assembly. Por outro lado, você também pode usar a ferramenta Svcutil.exe para criar definições de classe do Visual Basic ou C# em conformidade com os requisitos de esquemas XML que usam constructos que podem ser expressos por contratos de dados. Nesse caso, a opção de linha de comando /dconly não é necessária.

Se a entrada para a ferramenta Svcutil.exe for um esquema XML, por padrão, a ferramenta criará um conjunto de classes. Se você examinar essas classes, descobrirá que o DataContractAttribute foi aplicado. Você pode usar essas classes para criar um novo aplicativo para processar dados que devem ser trocados com outros serviços.

Você também pode executar a ferramenta em um endpoint que retorna um documento WSDL (Linguagem de Descrição dos Serviços Web) para automaticamente gerar o código e a configuração necessários para criar um cliente do WCF (Windows Communication Foundation). O código gerado inclui tipos marcados com o DataContractAttribute.

Reutilizar tipos existentes

Um contrato de dados tem dois requisitos básicos: um nome estável e uma lista de membros. O nome estável consiste no URI (identificador de recurso uniforme) do namespace e no nome local do contrato. Por padrão, quando você aplica a DataContractAttribute uma classe, ela usa o nome da classe como o nome local e o namespace da classe (prefixado com "http://schemas.datacontract.org/2004/07/") como o URI do namespace. Você pode substituir os padrões definindo as propriedades Name e Namespace. Você também pode alterar o namespace aplicando-o ContractNamespaceAttribute ao namespace. Use essa funcionalidade quando você tiver um tipo existente que processe dados exatamente como você precisa, mas tem um namespace e um nome de classe diferentes do contrato de dados. Ao substituir os valores predefinidos, você pode reutilizar seu tipo existente e garantir que os dados serializados estejam em conformidade com o contrato de dados.

Observação

Em qualquer código, você pode usar a palavra DataContract em vez da forma mais longa DataContractAttribute.

Controle de versão

Um contrato de dados também pode acomodar versões posteriores de si mesmo. Ou seja, quando uma versão posterior do contrato inclui dados extras, esses dados são armazenados e retornados para um remetente intocado. Para fazer isso, implemente a IExtensibleDataObject interface.

Para obter mais informações sobre controle de versão, consulte Controle de Versão do Contrato de Dados.