 VB. NET - Serialização de objetos
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 
 Empregados(i) = New Funcionario() Next End Sub Public Empregados() As Funcionario 
     | A classe 
    Funcionários possui dois construtores e um atributo Empregados do tipo 
    Funcionario: 
 | 
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 : 
 | 
Para realizar a operação vamos usar os seguintes namespaces da plataforma .NET:
Imports
System.XmlImports
System.IOImports
System.Runtime.Serialization.Formatters.BinaryImports
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 XMLDim 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 XMLDim 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.
| PrivateSub form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Carrega o objeto com alguns dados de exemploWith Data.Empregados(0) .Nome = "Jose Carlos Macoratti" .Codigo = 1 .Salario = 5000 .Cargo = "Analista Programador Consultor" End WithWith Data.Empregados(1) .Nome = "Jessica Naara" .Codigo = 0 .Salario = 3000 .Cargo = "Consultora" End WithWith Data.Empregados(2) .Nome = "Jefferson Andre" .Codigo = 2 .Salario = 2500 .Cargo = "Analista Junior" End WithEnd Sub | 
Para exibir os dados atuais do objeto usamos o código abaixo :
| PrivateSub btnobjAtual_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnobjAtual.Click 
     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) 
     | 
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a 
Objetos com VB .NET

Criptografando e descriptografando Senhas... - Macoratti.net