Partilhar via


Serialização XML

A serialização é o processo de conversão de um objeto em um formulário que pode ser prontamente transportado. Por exemplo, você pode serializar um objeto e transportá-lo pela Internet usando HTTP entre um cliente e um servidor. Na outra extremidade, a desserialização reconstrói o objeto a partir do fluxo.

A serialização XML serializa apenas os campos públicos e os valores de propriedade de um objeto em um fluxo XML. A serialização XML não inclui informações de tipo. Por exemplo, se você tiver um objeto Book que existe no namespace Library , não há garantia de que ele seja desserializado em um objeto do mesmo tipo.

Nota

A serialização XML não converte métodos, indexadores, campos privados ou propriedades somente leitura (exceto coleções somente leitura). Para serializar todos os campos e propriedades de um objeto, públicos e privados, use a DataContractSerializer serialização em vez de XML.

A classe central na serialização XML é a XmlSerializer classe, e os métodos mais importantes nessa classe são os métodos Serialize e Deserialize . O XmlSerializer cria arquivos C# e os compila em arquivos .dll para executar essa serialização. A XML Serializer Generator Tool (Sgen.exe) foi projetada para gerar esses assemblies de serialização com antecedência para serem implantados com seu aplicativo e melhorar o desempenho de inicialização. O fluxo XML gerado pelo XmlSerializer é compatível com a recomendação XSD (XML Schema Definition Language) 1.0 do World Wide Web Consortium (W3C). Além disso, os tipos de dados gerados são compatíveis com o documento intitulado "Esquema XML Parte 2: Tipos de dados".

Os dados em seus objetos são descritos usando construções de linguagem de programação como classes, campos, propriedades, tipos primitivos, matrizes e até XML incorporado na forma de objetos XmlElement ou XmlAttribute . Você tem a opção de criar suas próprias classes, anotadas com atributos, ou usar a ferramenta de definição de esquema XML para gerar as classes com base em um esquema XML existente.

Se você tiver um esquema XML, poderá executar a ferramenta Definição de esquema XML para produzir um conjunto de classes fortemente tipadas no esquema e anotadas com atributos. Quando uma instância dessa classe é serializada, o XML gerado adere ao esquema XML. Fornecido com essa classe, você pode programar em um modelo de objeto facilmente manipulado enquanto tem a certeza de que o XML gerado está em conformidade com o esquema XML. Essa é uma alternativa ao uso de outras classes no .NET, como as classes XmlReader e XmlWriter , para analisar e escrever um fluxo XML. Para obter mais informações, consulte Documentos e dados XML. Essas classes permitem que você analise qualquer fluxo XML. Por outro lado, use o XmlSerializer quando se espera que o fluxo XML esteja em conformidade com um esquema XML conhecido.

Os atributos controlam o fluxo XML gerado pela classe XmlSerializer , permitindo que você defina o namespace XML, o nome do elemento, o nome do atributo e assim por diante do fluxo XML. Para obter mais informações sobre esses atributos e como eles controlam a serialização XML, consulte Controlando a serialização XML usando atributos. Para obter uma tabela desses atributos que são usados para controlar o XML gerado, consulte Atributos que controlam a serialização XML.

A classe XmlSerializer pode serializar ainda mais um objeto e gerar um fluxo XML SOAP codificado. O XML gerado adere à seção 5 do documento do World Wide Web Consortium intitulado "Simple Object Access Protocol (SOAP) 1.1". Para obter mais informações sobre esse processo, consulte Como serializar um objeto como um fluxo XML codificado por SOAP. Para obter uma tabela dos atributos que controlam o XML gerado, consulte Atributos que controlam a serialização SOAP codificada.

A classe XmlSerializer gera as mensagens SOAP criadas por, e passadas para, XML Web Services. Para controlar as mensagens SOAP, você pode aplicar atributos às classes, valores de retorno, parâmetros e campos encontrados em um arquivo de serviço Web XML (.asmx). Você pode usar os atributos listados em "Atributos que controlam a serialização XML" e "Atributos que controlam a serialização SOAP codificada" porque um XML Web Services pode usar o estilo SOAP literal ou codificado. Para obter mais informações sobre como usar atributos para controlar o XML gerado por um XML Web Services, consulte XML Serialization with XML Web Services. Para obter mais informações sobre SOAP e XML Web Services, consulte Personalizando a formatação de mensagens SOAP.

Considerações de segurança para aplicativos XmlSerializer

Ao criar um aplicativo que usa o XmlSerializer, esteja ciente dos seguintes itens e suas implicações:

  • O XmlSerializer cria arquivos C# (.cs) e os compila em arquivos .dll no diretório nomeado pela variável de ambiente TEMP; a serialização ocorre com essas DLLs.

    Nota

    Esses assemblies de serialização podem ser gerados antecipadamente e assinados usando a ferramenta SGen.exe. Isso não funciona em um servidor de serviços Web. Em outras palavras, é apenas para uso do cliente e para serialização manual.

    O código e as DLLs são vulneráveis a um processo malicioso no momento da criação e compilação. Pode ser possível que dois ou mais usuários compartilhem o diretório TEMP. Compartilhar um diretório TEMP é perigoso se as duas contas tiverem privilégios de segurança diferentes e a conta de privilégio mais alto executar um aplicativo usando o XmlSerializer. Nesse caso, um usuário pode violar a segurança do computador substituindo o arquivo .cs ou .dll que é compilado. Para eliminar esta preocupação, certifique-se sempre de que cada conta no computador tem o seu próprio perfil. Por padrão, a variável de ambiente TEMP aponta para um diretório diferente para cada conta.

  • Se um usuário mal-intencionado envia um fluxo contínuo de dados XML para um servidor Web (um ataque de negação de serviço), o XmlSerializer continua a processar os dados até que o computador fique com poucos recursos.

    Esse tipo de ataque será eliminado se você estiver usando um computador executando o IIS (Serviços de Informações da Internet) e seu aplicativo estiver sendo executado no IIS. O IIS possui uma porta que não processa fluxos por mais de um valor definido (o padrão é 4 KB). Se você criar um aplicativo que não usa o IIS e desserializa com o XmlSerializer, você deve implementar uma porta semelhante que impede um ataque de negação de serviço.

  • O XmlSerializer serializa dados e executa qualquer código usando qualquer tipo dado a ele.

    Há duas maneiras pelas quais um objeto mal-intencionado representa uma ameaça. Ele pode executar código mal-intencionado ou pode injetar código mal-intencionado no arquivo C# criado pelo XmlSerializer. No segundo caso, há uma possibilidade teórica de que um objeto mal-intencionado possa de alguma forma injetar código no arquivo C# criado pelo XmlSerializer. Embora esse problema tenha sido examinado minuciosamente e tal ataque seja considerado improvável, você deve tomar a precaução de nunca serializar dados com um tipo desconhecido e não confiável.

  • Dados confidenciais serializados podem ser vulneráveis.

    Depois que o XmlSerializer tiver serializado dados, eles podem ser armazenados como um arquivo XML ou outro armazenamento de dados. Se o seu armazenamento de dados estiver disponível para outros processos, ou estiver visível numa intranet ou na Internet, os dados podem ser roubados e utilizados de forma maliciosa. Por exemplo, se você criar um aplicativo que serializa pedidos que incluem números de cartão de crédito, os dados serão altamente confidenciais. Para ajudar a evitar isso, proteja sempre o armazenamento de seus dados e tome medidas para mantê-los privados.

Serialização de uma classe simples

O exemplo de código a seguir mostra uma classe básica com um campo público.

Public Class OrderForm
    Public OrderDate As DateTime
End Class
public class OrderForm
{
    public DateTime OrderDate;
}

Quando uma instância dessa classe é serializada, ela pode ser semelhante à seguinte.

<OrderForm>
    <OrderDate>12/12/01</OrderDate>
</OrderForm>

Para obter mais exemplos de serialização, consulte Exemplos de serialização XML.

Itens que podem ser serializados

Os seguintes itens podem ser serializados usando a classe XmlSerializer :

  • Propriedades públicas de leitura/gravação e campos de classes públicas.

  • Classes que implementam ICollection ou IEnumerable.

    Nota

    Somente coleções são serializadas, não propriedades públicas.

  • XmlElement objetos.

  • Objetos XmlNode .

  • Objetos DataSet .

Para obter mais informações sobre como serializar ou desserializar objetos, consulte Como serializar um objeto e Como desserializar um objeto.

Vantagens de usar a serialização XML

A classe XmlSerializer oferece controle completo e flexível quando você serializa um objeto como XML. Se você estiver criando um XML Web Service, poderá aplicar atributos que controlam a serialização a classes e membros para garantir que a saída XML esteja em conformidade com um esquema específico.

Por exemplo, XmlSerializer permite que você:

  • Especifique se um campo ou propriedade deve ser codificado como um atributo ou um elemento.

  • Especifique um namespace XML a ser usado.

  • Especifique o nome de um elemento ou atributo se um nome de campo ou propriedade for inadequado.

Outra vantagem da serialização XML é que você não tem restrições sobre os aplicativos que desenvolve, desde que o fluxo XML gerado esteja em conformidade com um determinado esquema. Imagine um esquema que é usado para descrever livros. Possui um título, autor, editor e elemento de número ISBN. Você pode desenvolver um aplicativo que processa os dados XML da maneira que desejar, por exemplo, como um pedido de livro ou como um inventário de livros. Em ambos os casos, o único requisito é que o fluxo XML esteja em conformidade com o esquema XSD (XML Schema Definition Language) especificado.

Considerações sobre serialização XML

O seguinte deve ser considerado ao usar a classe XmlSerializer :

  • A ferramenta Sgen.exe é expressamente projetada para gerar assemblies de serialização para um desempenho ideal.

  • Os dados serializados contêm apenas os dados em si e a estrutura de suas classes. A identidade do tipo e as informações do assembly não estão incluídas.

  • Somente propriedades e campos públicos podem ser serializados. As propriedades devem ter acessadores públicos (métodos get e set). Se você precisar serializar dados não públicos, use a DataContractSerializer classe em vez da serialização XML.

  • Uma classe deve ter um construtor sem parâmetros para ser serializada por XmlSerializer.

  • Os métodos não podem ser serializados.

  • XmlSerializer pode processar classes que implementam IEnumerable ou ICollection de forma diferente se eles atenderem a determinados requisitos, da seguinte maneira.

    Uma classe que implementa IEnumerable deve implementar um método Add público que usa um único parâmetro. O parâmetro do método Add deve ser consistente (polimórfico) com o tipo retornado da propriedade IEnumerator.Current retornado do método GetEnumerator .

    Uma classe que implementa ICollection além de IEnumerable (como CollectionBase) deve ter uma propriedade indexada Item pública (um indexador em C#) que usa um inteiro e deve ter uma propriedade pública Count do tipo inteiro. O parâmetro passado para o método Add deve ser do mesmo tipo que o retornado da propriedade Item ou uma das bases desse tipo.

    Para classes que implementam ICollection, os valores a serem serializados são recuperados da propriedade Item indexada em vez de chamar GetEnumerator. Além disso, os campos públicos e as propriedades não são serializados, com exceção dos campos públicos que retornam outra classe de coleção (uma que implementa ICollection). Para obter um exemplo, consulte Exemplos de serialização XML.

Mapeamento de tipo de dados XSD

O documento do W3C intitulado XML Schema Part 2: Datatypes especifica os tipos de dados simples permitidos em um esquema XSD (XML Schema Definition Language). Para muitos deles (por exemplo, int e decimal), há um tipo de dados correspondente no .NET. No entanto, alguns tipos de dados XML não têm um tipo de dados .NET correspondente, por exemplo, o tipo de dados NMTOKEN . Nesses casos, se você usar a ferramenta de definição de esquema XML (XML Schema Definition Tool (Xsd.exe)) para gerar classes de um esquema, um atributo apropriado será aplicado a um membro da cadeia de caracteres do tipo e sua propriedade DataType será definida como o nome do tipo de dados XML. Por exemplo, se um esquema contiver um elemento chamado "MyToken" com o tipo de dados XML NMTOKEN, a classe gerada poderá conter um membro, conforme mostrado no exemplo a seguir.

<XmlElement(DataType:="NMTOKEN")> _
Public MyToken As String
[XmlElement(DataType = "NMTOKEN")]
public string MyToken;

Da mesma forma, se você estiver criando uma classe que deve estar em conformidade com um esquema XML específico (XSD), você deve aplicar o atributo apropriado e definir sua propriedade DataType para o nome do tipo de dados XML desejado.

Para obter uma lista completa de mapeamentos de tipo, consulte a propriedade DataType para qualquer uma das seguintes classes de atributo:

Consulte também