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()
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()
|
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
s.close()
Console.WriteLine(obj.artigoTitulo & " artigo no. " & obj.artigoNumero)
Next Console.WriteLine("Pressione Enter para Continuar...") Console.ReadLine()
|
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: