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.