VB .NET - Serializando e Deserializando uma lista de Objetos (XML e Binário)


 Neste artigo vou mostrar como podemos serializar e desserializar uma lista de objetos usando a linguagem VB .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.)

Neste artigo vamos realizar essas operações em uma lista de objetos.

Recursos usados:

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

Criando a solução no VS Community 2015

Abra o VS Community 2015 e clique em New Project;

Selecione a linguagem Visual Basic e o template Windows Forms Application;

Informe o nome Serializar_ListaObjetos e clique no botão OK;

No formulário Form1 inclua a partir da ToolBox os seguintes controles:

Defina o leiaute do formulário conforme a figura abaixo:

Definindo o objeto Aluno

Vamos definir agora o objeto que será o nosso domínio e partir do qual iremos criar a lista de objetos.

Para isso vamos criar uma classe chamada Aluno no projeto via menu Project -> Add Class definindo o código abaixo nesta classe:

<Serializable>
Public Class Aluno
    Public Property Nome As String
    Public Property Idade As Integer
    Public Property Email As String
    Public Property Inscricao As Date
End Class

Na classe Aluno temos 4 propriedades :

Definimos também o atributo <Serializable> para permitir que o objeto seja serializável.

No início do formulário vamos definir uma variável ListaAlunos como um tipo List(of Aluno) que representa a lista de objetos Aluno:

Dim ListaAlunos As List(Of Aluno) = Nothing

Criando a classe Serializar

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

Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Xml.Serialization
Public Class Serializar
    Public Function SerializacaoXML(_alunos As List(Of Aluno)) As String
        Try
            Dim xmlSer As New XmlSerializer(_alunos.GetType())
            Dim textWriter As New StringWriter()
            xmlSer.Serialize(textWriter, _alunos)
            xmlSer = Nothing
            Return textWriter.ToString()
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Public Function SerializaSalvaXML(_alunos As List(Of Aluno)) As Boolean
        Try
            Dim xmlSer As New XmlSerializer(_alunos.GetType())
            Dim stream As Stream = New FileStream("c:\dados\AlunosXML.xml", FileMode.Create, FileAccess.Write, FileShare.None)
            xmlSer.Serialize(stream, _alunos)
            xmlSer = Nothing
            stream.Close()
            Return True
        Catch ex As Exception
            Throw ex
        End Try
    End Function
    Public Function DeserialicaoXML(data As [String]) As List(Of Aluno)
        Try
            Dim xmlSer As New System.Xml.Serialization.XmlSerializer(GetType(List(Of Aluno)))
            Dim reader As TextReader = New StringReader(data)
            Dim obj As Object = xmlSer.Deserialize(reader)
            Return DirectCast(obj, List(Of Aluno))
        Catch ex As Exception
            Throw ex
        End Try
    End Function
    Public Function SerializacaoBinaria(_alunos As List(Of Aluno), local As String) As Boolean
        Try
            If Directory.Exists(Path.GetDirectoryName(local)) Then
                Using stream As Stream = File.Open(local, FileMode.Create)
                    Dim bin As New BinaryFormatter()
                    bin.Serialize(stream, _alunos)
                End Using
                Return True
            Else
                Throw New Exception("O local do arquivo informado não existe.")
            End If
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Public Function DeserializacaoBinaria(local As String) As List(Of Aluno)
        Try
            If Directory.Exists(Path.GetDirectoryName(local)) Then
                Using stream As Stream = File.Open(local, FileMode.Open)
                    Dim bin As New BinaryFormatter()
                    Dim listaAlunos = DirectCast(bin.Deserialize(stream), List(Of Aluno))
                    Return listaAlunos
                End Using
            Else
                Throw New Exception("O local do arquivo informado não existe.")
            End If
        Catch ex As Exception
            Throw ex
        End Try
    End Function
End Class

Nesta classe temos os métodos:

  1. SerializacaoXML - Serializa a lista de objetos no formato XML
  2. DeserialicaoXML - Deserializa o arquivo XML serializado anteriormente
  3. SerializaSalvaXML - Serializa a lista de objetos no formato XML salvando o arquivo em um local específico
  4. SerializacaoBinaria - Serializa a lista de objetos no formato binário salvando o arquivo em um local específico
  5. DeserializacaoBinaria - Deserializa a lista de objetos a partir do arquivo binário gerado anteriormente

Definindo o código do formulário

Agora vamos incluir no formulário o código em cada evento Click do respectivo botão de comando.

1- Criar Lista de Objetos

Private Sub btnCriarListaObjetos_Click(sender As Object, e As EventArgs) Handles btnCriarListaObjetos.Click
        'Inicilizando uma coleção de objetos aluno usando os inicializadores de objetos
        ListaAlunos = New List(Of Aluno)() From
                     {
                      New Aluno() With {
                                        .Nome = "Macoratti",
                                        .Idade = 48,
                                        .Email = "mac@yahoo.com",
                                        .Inscricao = New Date(2015, 8, 1)
                                        },
                      New Aluno() With {
                                        .Nome = "Jefferon",
                                        .Idade = 24,
                                        .Email = "jeff@bol.com.br",
                                        .Inscricao = New Date(2015, 7, 1)
                                        },
                     New Aluno() With {
                                        .Nome = "Janice",
                                        .Idade = 20,
                                        .Email = "jan@hotmail.com",
                                        .Inscricao = New Date(2015, 3, 2)
                                        },
                     New Aluno() With {
                                        .Nome = "Miriam",
                                        .Idade = 40,
                                        .Email = "mimi@hotmail.com",
                                        .Inscricao = New Date(2016, 2, 11)
                                        },
                     New Aluno() With {
                                        .Nome = "Jessica",
                                        .Idade = 23,
                                        .Email = "jess@hotmail.com",
                                        .Inscricao = New Date(2016, 2, 9)
                                        }
                     }
        ListarAlunos(ListaAlunos, lbAlunosMemoria)
        btnSerializarXML.Enabled = True
        btnSerializarBinario.Enabled = True
    End Sub

O método ListarAlunos() passa a lista de objetos (ListaAlunos) e o nome do controle listbox onde vamos exibir os objetos Aluno:

 Private Sub ListarAlunos(_alunos As List(Of Aluno), ctrlLb As ListBox)
        lbAlunosMemoria.Items.Clear()
        For Each aluno In _alunos
            Dim dadosAluno As String = aluno.Nome + vbTab + aluno.Email + vbTab + aluno.Idade.ToString() + vbTab + aluno.Inscricao.ToShortDateString()
            ctrlLb.Items.Add(dadosAluno)
        Next
   End Sub

2- Serializar para XML

  Private Sub btnSerializarXML_Click(sender As Object, e As EventArgs) Handles btnSerializarXML.Click
        Try
            Dim serXML As New Serializar
            txtAlunosXML.Text = serXML.SerializaSalvaXML(ListaAlunos)
        Catch ex As Exception
            MessageBox.Show("Erro " & ex.Message)
        End Try
 End Sub

Serializa a lista de objetos e retorna uma string que é exibida na caixa de texto txtAlunos.Text.

3- Serializar para Binário

 Private Sub btnSerializarBinario_Click(sender As Object, e As EventArgs) Handles btnSerializarBinario.Click
        Try
            Dim serBIN As New Serializar
            If (serBIN.SerializacaoBinaria(ListaAlunos, txtLocalArquivoBinario.Text)) Then
                MessageBox.Show("Lista de objetos serializada para binário com sucesso.")
                btnDeserializarBinario.Enabled = True
            Else
                MessageBox.Show("Ocorreu um erro ao serializar a lista.")
            End If
        Catch ex As Exception
            MessageBox.Show("Erro " & ex.Message)
        End Try
End Sub

Serializa a lista de objetos no local informado na caixa de texto txtLocalArquivoBinario.

4- Deserializar a partir do binário

Private Sub btnDeserializarBinario_Click(sender As Object, e As EventArgs) Handles btnDeserializarBinario.Click
        Dim alunos As List(Of Aluno)
        Try
            Dim deserBIN As New Serializar
            alunos = deserBIN.DeserializacaoBinaria(txtLocalArquivoBinario.Text)
            ListarAlunos(alunos, lbDados)
        Catch ex As Exception
            MessageBox.Show("Erro " & ex.Message)
        End Try
End Sub

Deserializa o arquivo binário a partir do local informado e exibe no ListBox - lbDados - usando o método ListarAlunos.

Executando o projeto iremos obter:

Pegue o projeto completo aqui: Serializando_ListaObjetos.zip

Até o próximo artigo...

Deitar-me faz em verdes pastos, guia-me mansamente a águas tranqüilas.Refrigera a minha alma; guia-me pelas veredas da justiça, por amor do seu nome.
Salmos 23:2,3

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 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti