VB.NET - Serializando objetos II


Devido a importância do tema resolvi continuar a escrever sobre serialização. Na verdade há quem diga que as duas grandes inovações da plataforma .NET são os atributos e a serialização.

Em ordem cronológica este artigo deveria ter sido anterior aos artigos :

Repetindo novamente o conceito sobre serialização , já mencionado, nos artigos acima temos que : Serialização é o processo que consiste em converter um objeto em uma sequência linear de bytes.

Lembre-se que um objeto pode ser visto como uma caixa preta, ou ainda, uma sequência de instruções de código e dados.

O nome byte é uma abreviação para 'binary digit' . Uma sequência linear de bytes é com frequência chamado de byte stream.(fluxo de bytes)

Mas agora me responda: "Por que motivos eu quereria converter um objeto em um fluxo de bytes ?"

De maneira simples e objetiva a resposta seria :  "Para poder mover o objeto para qualquer lugar."

Se você pensar que agora na plataforma .NET TUDO são objetos, você pode serializar : imagens, arquivos de dados, e, qualquer coisa que o seu sistema estiver fazendo.

E que a seguir pode armazenar estes objetos no disco, enviá-los pela Web, passá-los para outro sistema, manter uma cópia de segurança, etc...

Vai perceber que grande negócio é a tal serialização !

Como serializar um objeto ?

 

Você pode fazer isto de diversas maneiras, e já vai perceber as opções. Vamos começar criando um projeto do tipo Console de forma que o programa poderá ser executado a partir da linha de comando.

 

Crie um novo projeto no VS.NET do tipo Console Application com o nome serializandoObjetos.

 

Vamos então primeiro criar um objeto que será serializado.

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.

Como no VB.NET um objeto é representado em código por uma classe.

Vamos criar uma classe Exemplo abaixo, com dois membros públicos: um do tipo string e outro inteiro que irão conter os nomes dos 3 artigos já publicados sobre serialização.

<Serializable()> Public Class Exemplo

    Public artigoTitulo As String

    Public artigoNumero As Int16

End Class

 

Percebeu que a classe esta marcada com o atributo <Serializable()>, este atributo diz ao VB.NET para incluir o código necessário para converter nosso objeto para um fluxo de bytes.

 

A seguir crie um rotina no módulo com o seguinte código :

 

Sub SalvarArquivoSerializado()


1: Dim artigoLista As New ArrayList

2: Dim artigoInfo As New Exemplo

3: artigoInfo.artigoTitulo = "Serializando objetos"

4: artigoInfo.artigoNumero = 1

5: artigoLista.Add(artigoInfo)

6: artigoInfo = New Exemplo

7: artigoInfo.artigoTitulo = "Serializando objetos II"

8: artigoInfo.artigoNumero = 2

9: artigoLista.Add(artigoInfo)

10: artigoInfo = New Exemplo

11: artigoInfo.artigoTitulo = "Serializando DataSet"

12: artigoInfo.artigoNumero = 3

13: artigoLista.Add(artigoInfo)

14: Dim s As New FileStream("artigoInfo.txt", FileMode.Create)

15: Dim f As New BinaryFormatter

16: f.Serialize(s, artigoLista)

17: s.Close()


End
Sub

 

O código esta numerado de propósito para facilitar a explicação. Então vejamos :

 

1- Cria uma nova instância de um objeto Collection - neste caso um objeto ArrayList - para tratar nossos dados

2- Cria uma nova instância do nosso objeto serializável Exemplo.

3- Atribui um valor ao membro artigoTitulo

4- Atribui um valor ao membro artigoNumero

5- Inclui cada elemento no array


A linhas 6 a 13 repetem os passos acima explicados.

 

14 - Cria uma instância do objeto FileStream usado para escrever o objeto serializado para o arquivo e criar o arquivo.

 

15 - Cria uma instância do objeto BinaryFormatter que faz o trabalho de serializar o nosso objeto.

 

16 - Serializa o objeto para o arquivo.

 

17- Fecha o arquivo.

 

Será criado o arquivo texto chamado : artigoInfo.txt na pasta bin do projeto.

 

O código completo do projeto é :

 

Imports System.IO
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Xml.Serialization

Module Module1

    <Serializable()> Public Class Exemplo
        Public artigoTitulo As String
        Public artigoNumero As Int16
    End Class

    Sub SalvarArquivoSerializado()
1:      Dim artigoLista As New ArrayList
2:      Dim artigoInfo As New Exemplo

3:      artigoInfo.artigoTitulo = "Serializando objetos"
4:      artigoInfo.artigoNumero = 1
5:      artigoLista.Add(artigoInfo)

6:      artigoInfo = New Exemplo
7:      artigoInfo.artigoTitulo = "Serializando objetos II"
8:      artigoInfo.artigoNumero = 2
9:      artigoLista.Add(artigoInfo)

10:     artigoInfo = New Exemplo
11:     artigoInfo.artigoTitulo = "Serializando DataSet"
12:     artigoInfo.artigoNumero = 3
13:     artigoLista.Add(artigoInfo)

14:     Dim s As New FileStream("artigoInfo.txt", FileMode.Create)
15:     Dim f As New BinaryFormatter
16:     f.Serialize(s, artigoLista)
17:     s.Close()
    End Sub
    Sub Main()
        SalvarArquivoSerializado()
        Console.WriteLine("Arquivo serializado com sucesso.")
        Console.ReadLine()
    End Sub
End Module

 

 

Abrindo o arquivo criado com o bloco de notas temos :

 

 

Você esta espiando o arquivo : artigoInfo.txt serializado.

 

O arquivo contém além dos dados do nosso objeto , o objeto inteiro. O conteúdo está no formato binário e não pode ser lido por qualquer programa. Mas pode ser exposto pelo bloco de notas como acima.

 

As strings de todos os elementos do array para a propriedade artigoTitulo podem ser vistas claramente. Os valores para a propriedade artigoNumero, entretanto, não podem ser vistos pois são números binários..

 

Bem ,  o objetivo foi cumprido : serializar o objeto para um fluxo de bytes para um uso posterior.

 

Mas como podemos restaurar o objeto serializado ?   Elementar meu caro Watson : Deserializando.

 

Vamos fazer isto usando o mesmo objeto BinaryFormatter.  Crie uma outra rotina no modulo com o seguinte código :

 

Sub RestaurarArquivoSerializado(ByVal arquivo As String)
 

Dim s = New FileStream(arquivo, FileMode.Open)

Dim f As BinaryFormatter = New BinaryFormatter

Dim listaArtigosRestaurados As ArrayList


listaArtigosRestaurados = CType(f.Deserialize(s), ArrayList)

s.close()


Dim
obj As Exemplo


For
Each obj In listaArtigosRestaurados

     Console.WriteLine(obj.artigoTitulo & " artigo no. " & obj.artigoNumero)

Next
 

Console.WriteLine("Pressione Enter para Continuar...")

Console.ReadLine()


End
Sub

 

Nesta rotina estou passando o nome do arquivo a ser desserializado e usando o método Deserialize() do objeto para restaurar o arquivo criado.

 

Executando a rotina acima você deverá obter a leitura do arquivo e sua exibição no console , conforme tela abaixo:

 

 

Pegue o projeto completo aqui :   serializandoObjetos.zip

 

Espero que os conceitos estejam mais claros para você agora...

 

Até breve...
 

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