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:

untitled-1.gif
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.

untitled-2.gif
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.