Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Serialização é o processo de conversão de um objeto em um formulário que pode ser facilmente 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 biblioteca , não haverá garantia de que ele seja desserializado em um objeto do mesmo tipo.
Observação
A serialização XML não converte métodos, indexadores, campos privados nem propriedades somente leitura (exceto coleções somente leitura). Para serializar todos os campos e propriedades de um objeto, públicos e privados, use DataContractSerializer em vez de serialização 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 Desserializar . O XmlSerializer cria arquivos C# e os compila em arquivos .dll para executar essa serialização. A Ferramenta de Gerador de Serializador XML (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 está em conformidade com a recomendação XSD (Linguagem de definição de esquema XML) do W3C (World Wide Web Consortium) 1.0. Além disso, os tipos de dados gerados estão em conformidade 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é mesmo XML inserido 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 de Definição de Esquema XML para produzir um conjunto de classes fortemente tipadas para o esquema e anotadas com atributos. Quando uma instância de tal classe é serializada, o XML gerado adere ao esquema XML. Fornecido com essa classe, você pode programar em um modelo de objeto facilmente manipulado, garantindo 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 gravar 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 o fluxo XML estiver 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 SOAP XML codificado. O XML gerado segue a 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 SOAP-Encoded. 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 e passadas para os serviços Web XML. Para controlar as mensagens SOAP, você pode aplicar atributos às classes, valores retornados, 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 serviço Web XML pode usar o estilo SOAP literal ou codificado. Para obter mais informações sobre como usar atributos para controlar o XML gerado por um serviço Web XML, consulte Serialização XML com serviços Web XML. Para obter mais informações sobre os serviços Web SOAP e XML, consulte Personalizando a Formatação de Mensagens SOAP.
Considerações de segurança para aplicativos XmlSerializer
Ao criar um aplicativo que usa o XmlSerializer, lembre-se 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.
Observação
Esses conjuntos de serialização podem ser gerados com antecedência 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 mal-intencionado no momento da criação e da compilação. Pode ser possível que dois ou mais usuários compartilhem o diretório TEMP. Compartilhar um diretório TEMP será perigoso se as duas contas tiverem privilégios de segurança diferentes e a conta de privilégios mais altos executar um aplicativo usando o XmlSerializer. Nesse caso, um usuário pode violar a segurança do computador substituindo o arquivo .cs ou .dll compilado. Para eliminar essa preocupação, certifique-se sempre de que cada conta no computador tenha 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 enviar um fluxo contínuo de dados XML para um servidor Web (um ataque de negação de serviço), o XmlSerializer continuará a processar os dados até que o computador seja executado 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 em execução no IIS. O IIS apresenta uma porta que não processa fluxos por mais tempo do que um valor definido (o padrão é 4 KB). Se você criar um aplicativo que não usa o IIS e desserializa com o XmlSerializer, deverá implementar uma porta semelhante que impeça um ataque de negação de serviço.
O XmlSerializer serializa dados e executa qualquer código usando qualquer tipo fornecido a ele.
Há duas maneiras pelas quais um objeto mal-intencionado apresenta 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 esse 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 estar vulneráveis.
Depois que o XmlSerializer tiver dados serializados, ele poderá ser armazenado como um arquivo XML ou outro armazenamento de dados. Se o armazenamento de dados estiver disponível para outros processos ou estiver visível em uma intranet ou na Internet, os dados poderão ser roubados e usados mal-intencionados. 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, sempre proteja o repositório para seus dados e execute 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 e campos de leitura/gravação públicos de classes públicas.
Classes que implementam ICollection ou IEnumerable.
Observação
Somente as coleções são serializadas, não propriedades públicas.
Objetos XmlElement.
Objetos XmlNode.
Objetos DataSet.
Para obter mais informações sobre serialização ou desserialização de 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 ao serializar um objeto como XML. Se você estiver criando um serviço Web XML, 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, o 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 nos aplicativos que desenvolve, desde que o fluxo XML gerado esteja em conformidade com um determinado esquema. Imagine um esquema usado para descrever livros. Ele apresenta um título, um autor, um editor e um elemento de número ISBN. Você pode desenvolver um aplicativo que processa os dados XML da maneira desejada, por exemplo, como uma ordem 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 (linguagem de definição de esquema XML) 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 próprios dados e a estrutura de suas classes. A identidade de tipos e as informações de assemblies não sã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 de serialização XML.
Uma classe deve ter um construtor sem parâmetros para ser serializado pelo XmlSerializer.
Os métodos não podem ser serializados.
O XmlSerializer pode processar classes que implementam IEnumerable ou ICollection de forma diferente se atenderem a determinados requisitos, da seguinte maneira.
Uma classe que implementa o 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 retornada do método GetEnumerator .
Uma classe que implementa iCollection além de IEnumerable (como CollectionBase) deve ter uma propriedade indexada item público (um indexador em C#) que usa um inteiro e deve ter uma propriedade count pública de 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, campos públicos e propriedades não são serializados, com exceção de 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 W3C intitulado XML Schema Part 2: Datatypes especifica os tipos de dados simples que são permitidos em um esquema XSD (linguagem de definição de esquema XML). 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 de 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 XSD (esquema XML) específico, aplique o atributo apropriado e defina sua propriedade DataType para o nome de 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: