Já ouviu falar em serialização? Se você já precisou enviar um objeto por uma rede, ou gravar em disco, então você já deve ter utilizado esse recurso. Serializar um objeto é o mesmo que transformar um objeto em bytes.

Dessa forma podemos transformar um objeto em um arquivo, salvar em um banco de dados ou até mesmo transferir por uma rede, preservando o seu estado e sua estrutura original, podendo recuperá-lo em qualquer instante.

Essa técnica é bastante utilizada em sistemas distribuídos e persistência de objetos. Neste artigo mostraremos como tornar um objeto serializável e como utilizar esse recurso.

Serialização em disco

Muitas vezes estamos desenvolvendo uma aplicação e precisamos guardar o estado de um objeto, seja para armazenamento temporário ou definitivo, para que isso seja possível precisamos tornar o objeto serializável.

Vamos criar um pequeno exemplo de serialização de objeto. Criaremos um novo projeto (Windows Application com a linguagem VB) que chamaremos de SerializacaoObjeto (Figura 1).

Criando um projeto
Figura 1. Criando um projeto

Vamos criar agora a classe serializável, para tanto, adicione uma classe ao projeto e atribua o nome de ObjetoPessoa.vb (Figura 2). O código da classe será o presente na Listagem 1.

Criando a classe ObjetoPessoa
Figura 2. Criando a classe ObjetoPessoa

Public Class ObjetoPessoa
   Public nome As String
   Public sexo As Char
    _
   Public senha As String
End Class
Listagem 1. Classe ObjetoPessoa

Estamos apenas criando atributos para armazenar valores. Observe a tag antes da definição da classe. Ela indica que a classe é serializável, ou seja, pode ser transformada em uma sequência de bytes.

Podemos informar também que um determinado atributo do objeto não será serializado. Basta colocar a tag antes de sua definição. Foi o que fizemos com o atributo senha.

Abra o formulário do projeto, nele vamos colocar alguns controles. Adicione um TextBox chamado txtNome, outro TextBox chamado txtSenha e um ComboBox chamado cboSexo. Adicione também Labels para cada controle.

Vamos colocar também dois RadioButtons para informar se a serialização do objeto será em arquivo do tipo binário ou XML. Acrescentamos agora dois botões para as ações de “Serializar” e “Deserializar”. No final desse passo teremos uma tela semelhante à Figura 3.

Formulário de serialização e deserialização
Figura 3. Formulário de serialização e deserialização

Vamos agora para o código, clique no formulário e pressione F7. Crie um método chamado serializarObjetoXML que recebe um objeto do tipo ObjetoPessoa, conforme a Listagem 2.


Private Sub serializarObjetoXML( _
   ByVal objetoPessoa As ObjetoPessoa)
   'informa o formato que será serializado
   Dim arquivoSerializado _
     As Xml.Serialization.XmlSerializer = _
     New Xml.Serialization.XmlSerializer( _
     GetType(ObjetoPessoa))
     'informa o arquivo que será criado 
     'serializando o objeto
     Dim escreverArquivo As IO.StreamWriter = _
       New IO.StreamWriter("C:\Pessoa.xml")
       arquivoSerializado.Serialize(escreverArquivo, _
         objetoPessoa)
       escreverArquivo.Close()
 End Sub
Listagem 2. Método serializarObjetoXML

Esse método será responsável por transformar o objeto recebido em um arquivo XML em disco. Os códigos aqui demonstrados estão bem comentados, para facilitar o entendimento.

Vamos criar também um método chamado serializarObjetoBinario que recebe um objeto do tipo ObjetoPessoa, conforme a Listagem 3.


Imports System.Runtime.Serialization.Formatters.Binary
 ...
 Private Sub serializarObjetoBin( _
   ByVal objetoPessoa As ObjetoPessoa)
   'informa o formato que será serializado
   Dim Serializer As New BinaryFormatter()
   'informa o arquivo que será criado 
   'serializando o objeto
   Dim escreverArquivo As New IO.FileStream( _
     "C:\pessoa.bin", IO.FileMode.Create, _
     IO.FileAccess.Write, IO.FileShare.None)
     Serializer.Serialize(escreverArquivo, _ 
       objetoPessoa)
     escreverArquivo.Close()
 End Sub
Listagem 3. Método serializarObjetoBinario

Agora vamos criar o evento do botão Serializar que cria o objeto, preenche o mesmo e chama o método de serialização apropriado, conforme a Listagem 4.


Private Sub Button1_Click(ByVal sender _
 As System.Object, ByVal e As System.EventArgs) _
 Handles Button1.Click
 'cria o objeto que será serializado
 Dim objetoPessoa As New ObjetoPessoa
 'preenche os atributos para serializar
 objetoPessoa.nome = txtNome.Text
 objetoPessoa.sexo = cboSexo.Text
 objetoPessoa.senha = txtSenha.Text
 'chama o método de serialização passando 
 'Pessoa preenchido
 If rdbXml.Checked Then 
   'verifica que RadioButton está selecionado e 
   'chama a função de serialização apropriada
   Me.serializarObjetoXML(objetoPessoa)
 ElseIf rdbBinario.Checked Then
   Me.serializarObjetoBin(objetoPessoa)
 End If
End Sub
Listagem 4. Evento Click do Serializar

Agora só falta criar os métodos de deserialização e carregar os campos com os valores. Vamos criar os métodos deserializarObjetoXML e deserializarObjetoBin, conforme a Listagem 5.


Imports System.IO
...
Private Function deserializarObjetoXML() _
 As ObjetoPessoa
 'cria o objeto de deserialização informando o 
 'tipo que ele vai deserializar
 Dim Deserializer As _
   New Xml.Serialization.XmlSerializer( _
   GetType(ObjetoPessoa))
 'informa que arquivo vai deserializar
 Dim DataFile As New IO.FileStream("C:\pessoa.xml", _
   IO.FileMode.Open)
 Dim objetoPessoa As ObjetoPessoa
 objetoPessoa = CType(Deserializer.Deserialize( _
   DataFile), ObjetoPessoa)
 DataFile.Close()
 Return objetoPessoa
End Function

Private Function deserializarObjetoBin() _
 As ObjetoPessoa
 'cria o objeto de deserialização informando o tipo 
 'que ele vai deserializar
 Dim Deserializer As New BinaryFormatter()
 'informa qual arquivo ele vai deserializar
 Dim DataFile As New FileStream("C:\pessoa.bin", _
   FileMode.Open, FileAccess.Read, FileShare.None)
 Dim objetoPessoa As ObjetoPessoa
 objetoPessoa = CType( _
   Deserializer.Deserialize(DataFile), ObjetoPessoa)
 DataFile.Close()
 Return objetoPessoa
End Function
Listagem 5. Métodos deserializarObjetoXML e deserializarObjetoBin

Agora vamos criar o evento do botão Deserializar que lê o arquivo, gera o objeto e preenche os campos na tela, conforme a Listagem 6.


Private Sub Button2_Click(ByVal sender _
 As System.Object, ByVal e _
 As System.EventArgs) Handles Button2.Click
 'cria objeto que será serializado
 Dim objetoPessoa As New ObjetoPessoa
 If rdbXml.Checked Then 
   'verifica que radioButton esta selecionado e 
   'chama a função de deserialização apropriada
   objetoPessoa = Me.deserializarObjetoXML()
 ElseIf rdbBinario.Checked Then
   objetoPessoa = Me.deserializarObjetoBin()
 End If
 'preenche os atributos para serializar
 txtNome.Text = objetoPessoa.nome
 cboSexo.Text = objetoPessoa.sexo
 txtSenha.Text = objetoPessoa.senha
End Sub
Listagem 6. Evento Click do botão Deserializar

Pronto, temos um pequeno exemplo de serialização em disco. Agora vamos testar nossa aplicação, executando a mesma e preenchendo os campos. Escolha o tipo XML e clique em Serializar. No nosso exemplo estamos criando o arquivo pessoa.xml. Ao abrir o mesmo temos o conteúdo da Listagem 7.


<?xml version="1.0" encoding="utf-8"?><ObjetoPessoa 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <nome>teste</nome>
  <sexo>77</sexo>
  <senha>sdsdsd</senha>
</ObjetoPessoa>
Listagem 7. Arquivo XML gerado

Podemos observar que o atributo senha foi serializado mesmo com a tag , isso porque essa tag não é suportada quando a serialização é XML, apenas para serialização binária.

Vamos selecionar agora o tipo binário e clicar em Serializar. Será criado o arquivo pessoa.bin. Se limparmos os campos da tela e clicarmos em Deserializar, poderemos observar que o campo senha ficará em branco.

Web Service

Outra forma bastante utilizada para serialização é com sistemas distribuídos, ou seja, aplicações que funcionam em máquinas diferentes e trocam informações pela rede. Para podermos ver um exemplo disso vamos fazer um pequeno Web Service.

Web Service nada mais é que um serviço que permite que várias aplicações em plataformas diferentes possam se comunicar. Para isso, ela utiliza um padrão que é um formato universal, o formato XML.

Com Web Service podemos criar uma estrutura de métodos que podem ser chamados por outros sistemas, já existem diversos na internet, podemos citar como exemplo o Google que disponibiliza alguns serviços para que possam ser utilizados em outros sistemas.

Temos também a Amazom que disponibiliza a consulta de livros através de Web Services. Vamos criar um Web Service próprio, utilizando o .NET, é bastante simples. Vamos criar um novo projeto, do tipo Web Site.

Adicione um novo item do tipo Web Service, dando o nome de WebServiceSerializacao.asmx (Figura 4). Foi criado o Web Service que possui o código mostrado na Listagem 8.

Criando um Web Service no projeto Web
Figura 4. Criando um Web Service no projeto Web

Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols

_
_
_
Public Class WebServiceSerializacao
Inherits System.Web.Services.WebService

_
Public Function HelloWorld() As String
 Return "Hello World"
End Function
End Class
Listagem 8. Web Service gerado pelo .NET

Podemos perceber que ele possui um método chamado HelloWord. Pronto! Foi fácil criar o Web Service. Vamos selecionar o arquivo WebServiceSerializacao.asmx como página inicial e executar o projeto pressionando F5.

Na tela que abre, podemos observar algumas informações do Web Service, inclusive o nome do método existente (Figura 5). Ao clicar em HelloWord ele abre outra tela mostrando informações sobre o protocolo utilizado (Figura 6). Clique então em Chamar (ou Invoke), será executado o método e mostrado o retorno na tela (Figura 7).

Tela do browser com o Web Service
Figura 5. Tela do browser com o Web Service
Método HelloWorld
Figura 6. Método HelloWorld
Retorno do Web Service HelloWorld
Figura 7. Retorno do Web Service HelloWorld

Serialização em Web Service

Vamos implementar o nosso método nesse Web Service, para isso vamos criar o objetoSerializavel. Adicione um novo projeto do tipo ClassLibrary, que chamaremos de ClassesSerializaveis (Figura 8). Vamos renomear a classe Class1.vb para WSPessoa.vb. Na Listagem 9 temos o código da classe WSPessoa.vb

Criação de nova classe
Figura 8. Criação de nova classe

Public Class WSPessoa
  Public nome As String
  Public sexo As Char
  Public senha As String
End Class
Listagem 9. Classe WSPessoa

Vamos adicionar a referência desse projeto no Web Service, clicando com o botão direito e escolhendo o item Add Reference. Selecione a aba Projects, escolha o projeto ClassesSerializaveis e clique em OK. Vamos criar o método no Web Service logo abaixo do HelloWord, conforme a Listagem 10.


Public Function retornaClasse() _
 As ClassesSerializaveis.WSPessoa
 Dim objetoPessoa As ClassesSerializaveis.WSPessoa = _
   New ClassesSerializaveis.WSPessoa()
 'preenche os atributos para serializar
 objetoPessoa.nome = "Daniela"
 objetoPessoa.sexo = "F"
 objetoPessoa.senha = "3233"
 Return objetoPessoa
End Function
Listagem 10. Método que retorna uma classe serializável

Execute o projeto. Podemos observar na página aberta que agora aparece o método que acabamos de criar (Figura 9). Clique no link e depois em Chamar. Observe na Listagem 11 o retorno do Web Service.

Método criado no Web Service sendo mostrado no browser
Figura 9. Método criado no Web Service sendo mostrado no browser

<?xml version="1.0" encoding="utf-8" ?
 <WSPessoa xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
  <nome>Daniela</nome>
  <sexo>70</sexo>
  <senha>3233</senha>
</WSPessoa>
Listagem 11. Retorno gerado pelo Web Service

Podemos observar que o atributo sexo, por ser do tipo Char, foi passado no formato ASCII. Nosso Web Service está pronto. Vamos voltar para a primeira aplicação de serialização e fazer ela se comunicar com o Web Service.

Adicione mais um botão no formulário. Depois vamos adicionar uma referência ao Web Service, para isso, clique com o botão direito no projeto e escolha Add Web Reference.

Para que o projeto possa localizar o Web Service, primeiro temos que executar o Web Service no outro projeto. Você pode digitar a URL do Web Service ou escolher a opção Web services in this Solution (caso tenha criado em uma mesma solução todos os projetos). Clique no nome do Web Service e no botão Add Reference (Figura 10).

Adicionando referência ao Web Service
Figura 10. Adicionando referência ao Web Service

Vamos criar o evento do botão que adicionamos anteriormente e digitar o código da Listagem 12.


Private Sub Button3_Click(ByVal sender _
 As System.Object, ByVal e As System.EventArgs) _
 Handles Button3.Click
 'cria uma instância do tipo WSPessoa para 
 'receber do retorno do método
 Dim objetoWsPessoa As localhost.WSPessoa
 'instancia o Web Service
 Dim webService As _
   New localhost.WebServiceSerializacao
 'chama o método do Web Service
 objetoWsPessoa = webService.retornaClasse()
 'preenche os campos da tela com o retorno
 txtNome.Text = objetoWsPessoa.nome
 txtSenha.Text = objetoWsPessoa.senha
 cboSexo.Text = objetoWsPessoa.sexo
End Sub
Listagem 12. Evento Click do botão WebService

Pronto agora é só executar, clicar no botão e ver o retorno do Web Service.

Nesta artigo você aprendeu a utilizar serialização de objetos para persistir um objeto em disco. Além de como utilizar Web Service para comunicar uma aplicação para outra e até mesmo enviar classes com valores. Utilize as técnicas aqui apresentadas para facilmente permitir a troca de objetos entre suas aplicações utilizando uma intranet ou internet, com Web Services.