DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

Serialização de objetos

Veja nesse artigo como serializar objetos utilizando Web Services.

 

 


Fábio Campinho
(fcampinho@insix.com.br) é Microsoft Certified Application Developer (MCAD), com 9 anos de experiência em desenvolvimento Web e hoje é Diretor de TI da INSIX Soluções Inteligentes.

 

 


Thiago Almeida
(thiago.almeida@neoti.com.br) é pós-graduado em Sistemas de Informação com Ênfase em Componentes Distribuídos e Web, tem 5 anos de experiência em desenvolvimento WEB e hoje é Diretor de Desenvolvimento da NEOTI Studio de Tecnologia.

 

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).

 


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.

 

 


Figura 2
.
Criando a classe ObjetoPessoa

Listagem 1. Classe ObjetoPessoa

<Serializable()> _

Public Class ObjetoPessoa

    Public nome As String

    Public sexo As Char

    <NonSerialized()> _

    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.

 

 


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.

 


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

 

<WebService(Namespace:="http://tempuri.org/")> _

<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _

Public Class WebServiceSerializacao

 Inherits System.Web.Services.WebService

 

<WebMethod()> _

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).

 


Figura 5.
Tela do browser com o Web Service


Figura 6
.
Método 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

 


Figura 8
.
Criação de nova classe

Listagem 9. Classe WSPessoa

<Serializable()> _

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

<WebMethod()> _

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.

 


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).

 


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.

Conclusão

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.





    0 COMENTÁRIO

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.


Nenhum comentário foi postado - seja o primeiro a comentar!



Publicidade
Autor
Devmedia Bottcher

Notícias/Dicas/Artigos pulicados.




Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
3   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03