Serializando Objetos em C# .NET
Alan Ricardo (e-mail) é Microsoft Certified Professional e atua na área de desenvolvimento desde 1999. Desde 2003 desenvolve em C# e ASP.NET.
Fala pessoal, tudo bem com vocês?
O Visual Studio .NET possui muitas técnicas interessantes a serem aplicadas e uma delas é o processo de serialização e desserialização de objetos, o qual veremos nesse artigo.
O processo de serialização consiste em gravar o estado de um objeto para posterior utilização, e a desserialização de objeto é recuperar o objeto armazenado, permitindo que a partir do formato serializado se crie uma nova instância desse objeto. Uma das vantagens do processo de serialização, é ter a possibilidade de fazer com que os objetos trafeguem entre sistemas distintos.
Um objeto pode ser serializado de duas formas no .NET
A primeira delas é utilizando as classes do NameSpace System.Runtime.Serialization que realiza a serialização em dois formatos: XML ou Binário.
A segunda forma é através das classes do NameSpace System.XML.Serialization. As duas formas trabalham de maneira distinta, nesse artigo vamos abordar a segunda. Vamos ver uma aplicação de demonstração passo a passo.
- Crie um novo projeto C# Windows Application;
- Adicione a referência ao NameSpace System.Runtime.Serialization.Formatters.Soap;
- Adicione uma classe chamada Cliente com o seguinte código:
using System;
namespace Serializa
{
/// <summary>
/// Objeto que terá seu estado serializado
/// </summary>
[Serializable]
public class Cliente
{
private int codigo;
private string nome;
public int Codigo
{
get
{
return codigo;
}
set
{
codigo = value;
}
}
public string Nome
{
get
{
return nome;
}
set
{
nome = value;
}
}
}
A classe acima é o objeto que será serializado. Para que uma classe possa ser serializada, é necessário informar o atributo [Serializable] antes da declaração da classe, isso faz com que o FrameWork permita que essa classe seja serializada e dessa mantém o estado do objeto no formato especificado.
Após, abra o código fonte do arquivo Form1.cs e declare as seguintes referências:
using System.Runtime.Serialization.Formatters.Soap;
using System.Xml.Serialization;
using System.IO;
No modo de Design inclua dois labels, 04 textbox e dois botões com a nomenclatura abaixo:
labelCodigo
labelNome
textBoxCodigo
textBoxNome
textBoxResultCodigo
textBoxResultNome
buttonGravar
buttonLer
O Form deverá ficar com a aparência abaixo:
Após, adicione o seguinte evento ao buttonGravar:
private void buttonGravar_Click(object sender, System.EventArgs e)
{
Cliente c = new Cliente();
c.Codigo = Convert.ToInt32(textBoxCodigo.Text );
c.Nome = textBoxNome.Text;
SoapFormatter s = new SoapFormatter();
FileStream f = File.Create("cliente.xml");
s.Serialize(f,c);
f.Close();
textBoxCodigo.Text = "";
textBoxNome.Text = "";
essageBox.Show("Registro Serializado com sucesso!");
}
Analisando o código acima, observe que foi criada uma instância da classe Cliente e foi atribuido o seu respectivo estado. Verifique que foi instanciado o objeto SoapFormater que serializa o objeto Cliente através do FileStream "cliente.xml"
Feito os passos anteriores, adicione o seguinte evento ao buttonLer
private void buttonLer_Click(object sender, System.EventArgs e)
{
if(File.Exists("cliente.xml"))
{
SoapFormatter sXML = new SoapFormatter();
FileStream f = new FileStream("cliente.xml",FileMode.Open,FileAccess.Read);
Cliente c = (Cliente)sXML.Deserialize(f);
textBoxResultCodigo.Text = c.Codigo.ToString();
textBoxResultNome.Text = c.Nome;
f.Close();
MessageBox.Show("Registro Desserializado com sucesso!");
}
}
Verifique que, no código acima, primeiramente verificamos a existência do arquivo, após instância o objeto SoapFormater.
Uma vez instanciado o SoapFormater, basta realizar a desserialização do objeto. Para serializar o objeto informe os dados conforme a tela abaixo e clique no botão Gravar.
Abaixo a ilustração do estado do objeto serializado:
- <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/SMLSchema" xmlns:SOAP-
ENC="http://schemas.xmlsoap.org/soap/encoding/"xmlns:SOAP-
ENV="http://schemas.xmlsoap.org/soap/envelope/
xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0"SOAP-
ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
- <SOAP-ENV:Body>
-<a1:Clienteid="ref1"xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Serializa/Serializa%2C%
20Version%3D1.0.1981.32350%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<codigo>1</codigo>
<nome id="ref-3">City Bank</nome>
</a1:Cliente>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Veja que os atributos de Cliente foram serializados normalmente. No XML a referência para atributos tipados é feita a partir do atributo xml ref.
Conclusão
Serialização é um processo simples, onde define-se o formato, o destino para onde irá o .xml com o estado do objeto, serializa-se o objeto informando o stream e o objeto que deseja serializar, e por fim fecha-se o stream.
Desserializar um objeto é o inverso. Temos o arquivo cliente.xml que foi serializado pelo qual carregaremos um objeto Cliente vazio, e o mesmo terá o conteúdo do arquivo .xml.
Para utilizar o processo de serialização/desserialização de objetos em .NET, basta identificar a necessidade e aplicar a técnica de forma correta. No próximo artigo vamos aprender a utilizar as classes do namespace System.XML.Serialization no processo de serialização.
Até mais.