Serialização de objetos

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (3)  (0)

Veja nesse artigo como serializar objetos utilizando Web Services.

Escrito por Fábio Campinho e Thiago Almeida

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

Listagem 1. Classe ObjetoPessoa

Public Class ObjetoPessoa
     Public nome As String
     Public sexo As Char
      _
     Public senha As String
 End Class

Estamos apenas criando atributos para armazenar valores. Observe a tag <Serializable()> 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 <NonSerialized()> 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.

Listagem 2. Método serializarObjetoXML

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

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.

Listagem 3. Método serializarObjetoBinario

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

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.

Listagem 4. Evento Click do Serializar

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

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.

Listagem 5. Métodos deserializarObjetoXML e deserializarObjetoBin

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

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.

Listagem 6. Evento Click do botão Deserializar

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

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.

Listagem 7. Arquivo XML gerado

<?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>

Podemos observar que o atributo senha foi serializado mesmo com a tag <NonSerialized()>, 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

Listagem 8. Web Service gerado pelo .NET

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

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

Listagem 9. Classe WSPessoa

_
 Public Class WSPessoa
   Public nome As String
   Public sexo As Char
   Public senha As String
 End Class

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.

Listagem 10. Método que retorna uma classe serializável

_
 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

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

Listagem 11. Retorno gerado pelo Web Service

<?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>

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.

Listagem 12. Evento Click do botão WebService

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

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.

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?