Compartilhar via


Classe System.Runtime.Serialization.DataContractSerializer

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

Use a classe DataContractSerializer para serializar e desserializar instâncias de um tipo em um fluxo XML ou documento. Por exemplo, você pode criar um tipo nomeado Person com propriedades que contêm dados essenciais, como um nome e um endereço. Em seguida, você pode criar e manipular uma instância da Person classe e gravar todos os seus valores de propriedade em um documento XML para recuperação posterior ou em um fluxo XML para transporte imediato. Mais importante, o DataContractSerializer é usado para serializar e desserializar dados enviados em mensagens do WCF (Windows Communication Foundation). Aplique o DataContractAttribute atributo às classes e o DataMemberAttribute atributo aos membros da classe para especificar propriedades e campos serializados.

Para obter uma lista de tipos que podem ser serializados, consulte Tipos compatíveis com o Serializador de Contrato de Dados.

Para usar a DataContractSerializer, primeiro crie uma instância de uma classe e um objeto apropriado para escrever ou ler o formato; por exemplo, uma instância do XmlDictionaryWriter. Em seguida, chame o WriteObject método para persistir os dados. Para recuperar dados, crie um objeto apropriado para ler o formato de dados (como um XmlDictionaryReader documento XML) e chame o ReadObject método.

Para obter mais informações sobre como usar o DataContractSerializer, consulte a serialização e a desserialização.

Você pode definir o tipo de um serializador de contrato de dados usando o <elemento dataContractSerializer> em um arquivo de configuração de aplicativo cliente.

Preparar classes para serialização ou desserialização

O DataContractSerializer é usado em combinação com as classes DataContractAttribute e DataMemberAttribute. Para preparar uma classe para serialização, aplique DataContractAttribute à classe. Para cada membro da classe que retorna dados que você deseja serializar, aplique o DataMemberAttribute. Você pode serializar campos e propriedades, independentemente do nível de acesso: privado, protegido, interno, protegido interno ou público.

Por exemplo, seu esquema especifica um Customer com uma ID propriedade, mas você já tem um aplicativo existente que usa um tipo nomeado Person com uma Name propriedade. Para criar um tipo que esteja em conformidade com o contrato, primeiro aplique-o DataContractAttribute à classe. Em seguida, aplique DataMemberAttribute a todos os campos ou propriedades que você deseja serializar.

Observação

Você pode aplicar o DataMemberAttribute aos membros privados e públicos.

O formato final do XML não precisa ser texto. Em vez disso, o DataContractSerializer grava os dados como um conjunto de informações XML, o que permite gravar os dados em qualquer formato reconhecido pelo XmlReader e pelo XmlWriter. É recomendável que você use as classes XmlDictionaryReader e XmlDictionaryWriter para leitura e gravação, pois ambas são otimizadas para trabalhar com o DataContractSerializer.

Se você estiver criando uma classe que tenha campos ou propriedades que devem ser populadas antes que a serialização ou desserialização ocorra, use atributos de retorno de chamada, conforme descrito em Version-Tolerant Retornos de Chamada de Serialização.

Adicionar à coleção de tipos conhecidos

Ao serializar ou desserializar um objeto, é necessário que o tipo seja "conhecido" pelo DataContractSerializer. Comece criando uma instância de uma classe que implementa IEnumerable<T> (como List<T>) e adicione os tipos conhecidos à coleção. Em seguida, crie uma instância do DataContractSerializer usando uma das sobrecargas que utiliza o IEnumerable<T> (por exemplo, DataContractSerializer(Type, IEnumerable<Type>)).

Observação

Ao contrário de outros tipos primitivos, a DateTimeOffset estrutura não é um tipo conhecido por padrão, portanto, ela deve ser adicionada manualmente à lista de tipos conhecidos (consulte Tipos Conhecidos do Contrato de Dados).

Compatibilidade com futuras versões

O DataContractSerializer entende contratos de dados que foram projetados para serem compatíveis com versões futuras do contrato. Esses tipos implementam a IExtensibleDataObject interface. A interface apresenta a ExtensionData propriedade que retorna um ExtensionDataObject objeto. Para obter mais informações, consulte Forward-Compatible Data Contracts.

Executar sob confiança parcial

Ao instanciar o objeto de destino durante a desserialização, o DataContractSerializer não chama o construtor do objeto de destino. Se você criar um tipo [DataContract] acessível por confiança parcial (ou seja, é público e em um assembly que tem o atributo AllowPartiallyTrustedCallers aplicado) e que executa ações relacionadas à segurança, saiba que o construtor não é invocado. Em particular, as seguintes técnicas não funcionam:

  • Se você tentar restringir o acesso em ambiente de confiança parcial tornando o construtor privado ou interno ou adicionando um LinkDemand ao construtor, nenhuma dessas ações terá efeito durante a desserialização em um ambiente de confiança parcial.
  • Se você codificar a classe que pressupõe que o construtor foi executado, a classe poderá entrar em um estado interno inválido que seja explorável.