Desenvolvimento - C#

Serialização de objetos em XML com .NET

É possível realizar as tarefas de Serialização e Deserialização de maneira bastante simples e eficiente utilizando os recursos da classe XmlSerializer contida no .NET Framework 2.0.

por Anderson Melo



É muito comum os desenvolvedores depararem-se com um cenário onde precisam criar uma funcionalidade que será responsável por gerar um XML a partir de um objeto, e/ou gerar um objeto a partir de um XML, ou seja, deparam-se com a necessidade de realizar Serialização e Deserialização de objetos em XML.

O .Net Framework possui diversas classes para realizar a Serialização de objetos, entre elas existe a System.Xml.Serialization.XmlSerializer, que é responsável pela Serialização de objetos em XML. Através desta classe, é possível serializar um objeto de maneira bastante simples e com poucas linhas de código.

Para ilustrar a utilização da classe System.Xml.Serialization.XmlSerializer, este artigo apresenta uma pequena Console Application que possui uma classe do tipo Entity ou Model chamada de Cliente que será serializada e deserializada, e uma outra classe chamada de Serializador que possui dois métodos, o Serializar e o Deserializar, que como os nomes sugerem, serão responsáveis pela serialização e deserialização de qualquer objeto, que neste caso será um objeto da classe Cliente.

using System;

using System.Collections.Generic;

using System.Text;

namespace Artigo.Serializacao

{

public class Cliente

{

private string _codigoCliente;

private string _nomeCliente;

public string CodigoCliente

{

get { return _codigoCliente; }

set { _codigoCliente = value; }

}

public string NomeCliente

{

get { return _nomeCliente; }

set { _nomeCliente = value; }

}

public Cliente()

{ }

public Cliente(string codigoCliente, string nomeCliente)

{

this._codigoCliente = codigoCliente;

this._nomeCliente = nomeCliente;

}

}

}

Listagem da classe Cliente.

Observe que a classe Cliente não possui o atributo Serializable(), embora seja uma boa prática colocá-lo em classes do tipo Entity, a classe XmlSerializer não obriga que o objeto a ser serializado tenha este atributo, basta apenas que ele possua um construtor público sem parâmetros e que as propriedades a serem serializadas sejam publicas.

A classe Serializador utiliza os Namespaces System.IO e System.Xml.Serialization. O método Serializar instancia um objeto StringWriter que será responsável por armazenar o Xml gerado e cria também uma instancia da classe XmlSerializer. No construtor da classe XmlSerializer é passado o tipo do objeto que deseja-se serializar, e logo em seguida chama-se o método void Serialize, passando o StringWriter e o objeto a ser serializado. Após a execução deste método, o objeto do tipo StringWriter contém o XML gerado, bastando somente então retorna-lo chamando o método ToString().

O método Deserializar por sua vez, cria uma instância da classe StringReader passando em seu construtor uma string contendo o XML que se deseja deserializar. Logo em seguida cria-se uma instância da classe XmlSerializer, passando como parâmetro em seu construtor um objeto do tipo Type, que será o tipo a ser deserializado. Feito isto, basta chamar o método Deserialize, passando como parâmetro o objeto do tipo StringReader, e ele irá retornar o objeto criado apartir do XML.

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

using System.Xml.Serialization;

namespace Artigo.Serializacao

{

public class Serializador

{

public static string Serializar(object algumObjeto)

{

StringWriter writer = new StringWriter();

XmlSerializer serializer = new

XmlSerializer(algumObjeto.GetType());

serializer.Serialize(writer, algumObjeto);

return writer.ToString();

}

public static object Deserializar(string xml, Type type)

{

StringReader reader = new StringReader(xml);

XmlSerializer serializer = new XmlSerializer(type);

return serializer.Deserialize(reader);

}

}

}

Listagem da classe Serializador.

Abaixo, a classe que consome a classe Serializador.

using System;

using System.Collections.Generic;

using System.Text;

using System.Diagnostics;

namespace Artigo.Serializacao

{

class Program

{

static void Main(string[] args)

{

// Serialização

Cliente cliente = new Cliente("0001", "Mariana");

string xml = Serializador.Serializar(cliente);

Console.WriteLine(xml);

// Deserialização

Cliente clienteDeserializado =

Serializador.Deserializar(xml, typeof(Cliente)) as Cliente;

Console.WriteLine("Codigo: {0} \t Nome: {1}",

clienteDeserializado.CodigoCliente,

clienteDeserializado.NomeCliente);

Console.ReadLine();

}

}

}

Listagem do método Main.

Observe que no método Main um objeto da classe Cliente é instanciado, populado e em seguida é serializado, gerando um XML que é armazenado na variável xml. Logo em seguida um outro objeto da classe cliente é apenas declarado, e então é chamado o método Deserializar da classe Serializador, retornando desta forma o objeto Cliente a partir da variável xml.


Figura 1: Saída da Console Application.

Conclusão

É possível realizar as tarefas de Serialização e Deserialização de maneira bastante simples e eficiente utilizando os recursos da classe XmlSerializer contida no .NET Framework 2.0.
Anderson Melo

Anderson Melo - Formado em Sistemas de Informação pelo Mackenzie, trabalha com a Plataforma .NET desde meados de 2003. Atualmente atua como desenvolvedor na General Electric.