VB .NET - Armazenando um objeto serializado em um arquivo


  Neste artigo vou mostrar como armazenar objetos serializados em um arquivo usando a linguagem VB .NET.

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.

Então vamos colocar o seguinte problema:

Você precisa armazenar um objeto serializado e o seu estado em um arquivo e depois deserializar o objeto.

Não existe uma única abordagem para resolver esse problema, e, neste artigo eu vou apresentar uma das abordagens possíveis.

Para resolver o problema podemos usar formatador para serializar o objeto e gravá-lo em um objeto System.IO.FileStream. Quando você precisar recuperar o objeto, use o mesmo tipo de formatador para ler os dados serializados do arquivo e assim deserialize o objeto.

A biblioteca de classes do .NET Framework inclui as seguintes implementações de formatador para serializar objetos em formato binário ou SOAP:

Usando as classes BinaryFormatter e SoapFormatter, você pode serializar uma instância de qualquer tipo serializável.  A classe BinaryFormatter produz um fluxo de dados binários representando o objeto e seu estado. A classe SoapFormatter produz um documento SOAP.

SOAP é um protocolo baseado em XML usado para trocar mensagens pela rede. O SOAP é usado como o principal mecanismo de comunicação com os serviços da Web.

As classes BinaryFormatter e SoapFormatter implementam a interface System.Runtime.Serialization.IFormatter, que define dois métodos: Serialize e Deserialize.

  1. O método Serialize() usa uma referência a System.IO.Stream e uma referência System.Object como argumentos, serializa o objeto, e escreve-o para o fluxo.

  2. O método Deserialize() toma uma referência de fluxo como um argumento, lê os dados de objeto serializados do fluxo e retorna uma referência de objeto a um objeto desserializado. (Você deve converter a referência de objeto retornada para o tipo correto)

Então vamos aplicar esses conceitos e mostrar isso na prática.

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando um projeto no VS 2015

Abra o Visual Studio Community 2015 e clique em New Project;

Selecione Visual Basic, o template Windows Forms Application e informe o nome Vbnet_Serializacao;

A seguir no formulário Form1.vb inclua os seguintes controles:

Disponha os controles conforme o leiaute da figura abaixo:

Referenciando o namespace System.Runtime.Serialization.Formatters.Soap

Clique com o botão direito sobre o projeto e a seguir clique em Add Reference;

A seguir clique em Assemblies e marque o item System.Runtime.Serialization.Formatters.Soap;

Definindo a classe de serviços com os métodos para serializar e deserializar arquivos

No menu Project clique em Add Class e  informe o nome Servicos.vb. A seguir inclua o código abaixo nesta classe:

Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Runtime.Serialization.Formatters.Soap
Public Class Servicos
    ' Serializa um objeto ArrayList para um arquivo binário
    Public Shared Sub BinarySerialize(ByVal lista As ArrayList, ByVal nomeArquivoBinario As String)
        Using str As IO.FileStream = File.Create(nomeArquivoBinario)
            Dim bf As New BinaryFormatter()
            bf.Serialize(str, lista)
        End Using
    End Sub
    ' Deserializa um objeto arrayList de um arquivo binário
    Public Shared Function BinaryDeserialize(ByVal NomeArquivo As String) As ArrayList
        Dim lista As ArrayList = Nothing
        Using str As FileStream = File.OpenRead(NomeArquivo)
            Dim bf As New BinaryFormatter()
            lista = DirectCast(bf.Deserialize(str), ArrayList)
        End Using
        Return lista
    End Function
    ' Serializa um objeto ArrayList para um arquivo SOAP
    Public Shared Sub SoapSerialize(ByVal lista As ArrayList, ByVal nomeArquivoSoap As String)
        Using str As FileStream = File.Create(nomeArquivoSoap)
            Dim sf As New SoapFormatter()
            sf.Serialize(str, lista)
        End Using
    End Sub
    ' Deserializa um objteo ArrayList de um arquivo SOAP
    Public Shared Function SoapDeserialize(ByVal NomeArquivo As String) As ArrayList
        Dim lista As ArrayList = Nothing
        Using str As FileStream = File.OpenRead(NomeArquivo)
            Dim sf As New SoapFormatter()
            lista = DirectCast(sf.Deserialize(str), ArrayList)
        End Using
        Return lista
    End Function
   'Le um arquivo 
    Public Shared Function LerArquivo(ByVal nomeArquivoBin As String) As String
        Dim fs As New FileStream(nomeArquivoBin, FileMode.Open)
        Dim b(fs.Length - 1) As Byte
        fs.Read(b, 0, b.Length - 1)
        fs.Close()
        fs = Nothing
        Dim dados As String = System.Text.ASCIIEncoding.ASCII.GetString(b)
        Return dados
    End Function
End Class
 

Nesta classe definimos métodos estáticos para serializar e deserializar arquivos SOAP e Binários, usando os recursos dos namespaces System.Runtime.Serialization.Formatters.Binary e   System.Runtime.Serialization.Formatters.Soap.

Definindo o código do formulário

Inclua o seguinte namespace no formulário:

Imports System.IO

A seguir defina as seguinte variáveis que iremos usar para o ArrayList e para os nomes dos arquivos:

Dim alunos As New ArrayList
Dim nomeArquivoSoap As String = "aluno.soap"
Dim nomeArquivoBinario As String = "aluno.bin"

Agora definir o código nos eventos Click dos controles do formulário:

1 - Criando um ArrayList

Inclua o código abaixo no evento Click do botão :  Incluir no Array

   Private Sub btnIncluir_Click(sender As Object, e As EventArgs) Handles btnIncluir.Click
        lbAlunos.Items.Add(txtNome.Text)
        alunos.Add(txtNome.Text)
        txtNome.Text = ""
        grpAcao.Enabled = True
    End Sub

2 - Serializando objetos

No evento Click do botão Serializar inclua o código a seguir:

Private Sub btnSerializar_Click(sender As Object, e As EventArgs) Handles btnSerializar.Click
        If rdbSOAP.Checked Then
            If File.Exists(nomeArquivoSoap) Then
                File.Delete(nomeArquivoSoap)
            End If
            Try
                Servicos.SoapSerialize(alunos, nomeArquivoSoap)
                MessageBox.Show("Arquivo " & nomeArquivoSoap & " serializado com sucesso")
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        Else
            If File.Exists(nomeArquivoBinario) Then
                File.Delete(nomeArquivoBinario)
            End If
            Try
                Servicos.BinarySerialize(alunos, nomeArquivoBinario)
                MessageBox.Show("Arquivo " & nomeArquivoBinario & " serializado com sucesso")
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End If
    End Sub
 

3 - Deserializando objetos

No evento Click do botão - Deserializar - inclua o código abaixo:

 Private Sub btnDeserializar_Click(sender As Object, e As EventArgs) Handles btnDeserializar.Click
        If rdbSOAP.Checked Then
            If File.Exists(nomeArquivoSoap) Then
                Dim listaSoap As ArrayList = Servicos.SoapDeserialize(nomeArquivoSoap)
                For Each aluno As String In listaSoap
                    txtResultadoDeserializacao.Text += aluno & vbTab
                Next
            Else
                MessageBox.Show("Arquivo " & nomeArquivoSoap & " não existe")
            End If
        Else
            If File.Exists(nomeArquivoBinario) Then
                Dim listaBinaria As ArrayList = Servicos.BinaryDeserialize(nomeArquivoBinario)
                For Each aluno As String In listaBinaria
                    txtResultadoDeserializacao.Text += aluno & vbTab
                Next
            Else
                MessageBox.Show("Arquivo " & nomeArquivoBinario & " não existe")
            End If
        End If
    End Sub

Executando o projeto iremos obter:

Pegue o projeto completo aqui: Vbnet_Serializacao.zip

"Porque as suas coisas invisíveis, desde a criação do mundo, tanto o seu eterno poder, como a sua divindade, se entendem, e claramente se vêem pelas coisas que estão criadas, para que eles fiquem inescusáveis"
Romanos 1:20

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 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti