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 XML Dim 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 SubPrivate Sub btnXmlDeserializacao_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnXmlDeserializacao.Click 'DeSerializacao XML Dim 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 SubPrivate 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.
Private Sub form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load'Carrega o objeto com alguns dados de exemplo With Data.Empregados(0).Nome = "Jose Carlos Macoratti" .Codigo = 1 .Salario = 5000 .Cargo = "Analista Programador Consultor" End With With Data.Empregados(1).Nome = "Jessica Naara" .Codigo = 0 .Salario = 3000 .Cargo = "Consultora" End With With Data.Empregados(2).Nome = "Jefferson Andre" .Codigo = 2 .Salario = 2500 .Cargo = "Analista Junior" End With End Sub |
Para exibir os dados atuais do objeto usamos o código abaixo :
Private Sub 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