VB. NET - Serialização de objetos


Já ouviu falar em serialização ? O que é serializar ? Como podemos fazer isto na plataforma .NET ?

De forma genérica a serialização é uma técnica usada para persistir objetos , ou seja :  gravar objetos em disco , fazer a transmissão remota de objetos via rede , armazenar os objetos em um banco de dados e/ou arquivos (binários , xml, etc.)

Serializar nada mais é do que colocar os valores que o objeto está utilizando juntamente com suas propriedades de uma forma que fique em série (sequencial) . Fazendo isto estamos tornando o objeto Serializable, e, tornando um objeto Serializable, estamos atribuindo essa qualidade a ele, e dando privilégios para que o mesmo possa ser gravado em disco ou enviado por rede.

A serialização é o processo de armazenar um objeto , incluindo todos os atributos públicos e privados para um stream.

Se você faz a serialização naturalmente vai querer fazer o processo inverso - deserialização , que seria restaurar os atributos de um objeto gravado em um stream. (Este stream pode ser um arquivo binário , xml , etc.)

Nota: Tradução de stream - fluxo (no caso de dados) . Melhor deixar stream mesmo.

Por que você iria querer usar a serialização

Primeiro por que nem tudo se pode armazenar em um banco de dados . As vezes a natureza da sua aplicação não exige um banco de dados ou usar um banco de dados pode ficar muito caro para o tamanho dos dados que se quer guardar ou ainda você pode também querer gravar os dados em disco para posterior recuperação. Enfim , se você não quer usar um banco de dados , e quer persistir seus objetos pode fazer isto de diversas maneiras mas o trabalho exigirá mais código , mais trabalho e mais tempo.

Serializar não é tão simples como parece pois para armazenar uma estrutura de memória que se utilize de referências é preciso armazenar todos os tipos de dados primitivos isoladamente com alguma chave de acesso . Sem contar que não é possível armazenar diretamente referências a objetos porque as mesmas são baseadas em endereços de memória e a própria ordem em que se carrega os objetos pode implicar em que eles sejam alocados em posições de memória diferentes daquelas que ocupavam quando foram gravados.

A plataforma .NET oferece recursos que tornam as tarefas de Serializar e deserializar , tarefas muito simples de serem realizadas. Neste artigo vou mostrar como podemos serializar e deserializar objetos no VB .NET.

Nota: Serializar objetos já era possível no VB6.

Conceitos básicos

Para serializar um objeto você tem que :

Para permitir que um objeto seja serializável usamos o atributo  <Serializable> .

Podemos também prevenir que um atributo da classe seja serializável. (As vezes isto se justifica.) usando o atributo <NonSerialized> ou <Serialization.XmlIgnore()> para arquivos Xml , na frente do campo que não queremos serializar.

Assim na classe Funcionário abaixo estamos indicando que a estrutura pode ser serializada. Perceba que o atributo Salario não será serializado com a estrutura.

  <Serializable()> _
   Public Class Funcionario
        Public Nome As String
        Public Codigo As Integer
        <NonSerialized(), Serialization.XmlIgnore()> Public Salario As Single
        Public Cargo As String
  
  End Class

 

 A classe Funcionario possui 4 atributos públicos Nome , codigo , salario e cargo.

O atributo salario não será serializado.

A classe Funcionários que também vai ser serializada.

<Serializable()> _

Public Class Funcionarios

   

   Public Sub New()

    End Sub
 

    Public Sub New(ByVal NumeroDeFuncionarios As Integer)
 

       ReDim Empregados(NumeroDeFuncionarios - 1)

       Dim i As Integer


      
For i = 0 To NumeroDeFuncionarios - 1

           Empregados(i) = New Funcionario()

       Next


    End
Sub
 

    Public Empregados() As Funcionario


End
Class

A classe Funcionários possui dois construtores e um atributo Empregados do tipo Funcionario:
  • Um construtor vazio
  • Um construtor que recebe como argumento o número de funcionarios e cria uma instância de Funcionario e a armazena no atributo Empregados

Nosso objetivo será criar uma aplicação que permita a serialização e a deserialização dos objetos destas classes para um arquivo binário e para um arquivo XML.

Crie um novo projeto no VS.NET com o nome de Serializacao, e no formulário padrão form1.vb insira dois GroupBox e 5 botões de comando conforme figura abaixo :

- Nome dos botões de comando :
  • btnXmlSerializacao - faz serialização para arquivo xml - teste.xml
  • btnXmlDeserializacao - deserializa do arquivo xml
  • btnBinSerializacao - faz a serialização para arquivo binário - teste.bin
  • btnBinDeserializacao - deserializa do arquivo binário
  • btnobjAtual - exibe os dados do objeto atual
   

Para realizar a operação vamos usar os seguintes namespaces da plataforma .NET:

Imports System.Xml

Imports System.IO

Imports System.Runtime.Serialization.Formatters.Binary

Imports System.Runtime.Serialization

 

Ao iniciar a aplicação vamos criar uma instância da classe funcionários.

Dim Data As New Funcionarios(3)

A seguir o código para serialização XML : (será criado o arquivo teste.xml)

Private Sub btnXmlSerializacao_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnXmlSerializacao.Click

'Serializacao XML

  Dim Serializer As New Serialization.XmlSerializer(GetType(Funcionarios))

  Dim DataFile As New FileStream("teste.xml", FileMode.Create, FileAccess.Write, FileShare.None)

  Serializer.Serialize(DataFile, Data)

  DataFile.Close()

  Data = Nothing

End Sub


Private Sub btnXmlDeserializacao_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnXmlDeserializacao.Click

  'DeSerializacao XML

  Dim Deserializer As New Serialization.XmlSerializer(GetType(Funcionarios))

  Dim DataFile As New FileStream("teste.xml", FileMode.Open, FileAccess.Read, FileShare.None)
 

  Data = CType(Deserializer.Deserialize(DataFile), Funcionarios)

  DataFile.Close()

End Sub

 

Agora o código para a serialização binária:(será criado o arquivo teste.bin)

Private Sub btnBinSerializacao_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBinSerializacao.Click

   'Serializacao binaria

   Dim Serializer As New BinaryFormatter()

   Dim DataFile As New FileStream("teste.bin", FileMode.Create, FileAccess.Write, FileShare.None)

   Serializer.Serialize(DataFile, Data)

   DataFile.Close()

   Data = Nothing

End Sub


Private Sub btnBinDeserializacao_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBinDeserializacao.Click

  'DeSerializacao binaria

   Dim Deserializer As New BinaryFormatter()

   Dim DataFile As New FileStream("teste.bin", FileMode.Open, FileAccess.Read, FileShare.None)

   Data = CType(Deserializer.Deserialize(DataFile), Funcionarios)

   DataFile.Close()

End Sub

No evento form Load do formulário form1 vamos carregar alguns dados no objeto Data.

Private Sub form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'Carrega o objeto com alguns dados de exemplo

With Data.Empregados(0)

   .Nome = "Jose Carlos Macoratti"

   .Codigo = 1

  .Salario = 5000

  .Cargo = "Analista Programador Consultor"

End With

With Data.Empregados(1)

  .Nome = "Jessica Naara"

  .Codigo = 0

  .Salario = 3000

  .Cargo = "Consultora"

End With

With Data.Empregados(2)

  .Nome = "Jefferson Andre"

  .Codigo = 2

  .Salario = 2500

  .Cargo = "Analista Junior"

End With

End Sub

Para exibir os dados atuais do objeto usamos o código abaixo :

Private Sub btnobjAtual_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnobjAtual.Click


'Exibe o estado atual do objeto

Dim Mensagem As String = ""
 

If Data Is Nothing Then

   Mensagem = "Objeto está Vazio"

Else

  Dim i As Integer

  For i = 0 To Data.Empregados.Length - 1

    With Data.Empregados(i)

       Mensagem &= "Funcionário : " & .Codigo.ToString & Environment.NewLine

       Mensagem &= " Nome : " & .Nome & Environment.NewLine

       Mensagem &= " Salario : " & .Salario.ToString("C0") & Environment.NewLine

       Mensagem &= " Cargo : " & .Cargo & Environment.NewLine & Environment.NewLine

    End With

  Next

End If

 

MessageBox.Show(Mensagem, "Dados do Objeto", MessageBoxButtons.OK)


End
Sub

Pronto ! acabamos de serializar e deserializar objetos das classes Funcionario e Funcionarios.

Abaixo a sequência de telas obtidas na operação:

Os dados do objeto atual sendo exibidos antes de realizar a serialização Ao realizar a serialização os dados do objeto serão gravados em disco e o objeto não conterá mais dados Realizando a deserialização restauramos o objeto do arquivo mas o atributo salario não será recuperado pois não foi serializado.

Pegue o projeto completo => aqui

Nota: = Veja também o artigo :  Gerenciando dados sem usar um banco de dados

Eu sei é apenas VB.NET , mas eu gosto...

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti