Serialização de objetos
Veja nesse artigo como serializar objetos utilizando Web Services.
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).
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.
Public Class ObjetoPessoa
Public nome As String
Public sexo As Char
_
Public senha As String
End ClassEstamos 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.
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 SubEsse 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 SubAgora 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 SubAgora 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 FunctionAgora 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 SubPronto, 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>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.
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 ClassPodemos 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).
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
Public Class WSPessoa
Public nome As String
Public sexo As Char
Public senha As String
End ClassVamos 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 FunctionExecute 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.
<?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).
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 SubPronto 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.
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo