Serialização é o processo de converter um objeto em uma sequência linear de bytes chamado de "fluxo de bytes". A desserialização apenas reverte o processo. Mas por que você deseja converter um objeto em um fluxo de bytes?
A principal razão é que você pode mover o objeto. Considere as possibilidades. Como "tudo é um objeto" no .NET, você pode serializar qualquer coisa e salvá-la em um arquivo. Assim, você pode serializar imagens, arquivos de dados, o estado atual de um módulo de programa ('estado' é como um instantâneo do seu programa em um determinado momento, para que você possa suspender temporariamente a execução e iniciar novamente mais tarde)... o que você precisar fazer.
Você também pode armazenar esses objetos no disco em arquivos, enviá-los pela Web, passá-los para um programa diferente, manter uma cópia de segurança por segurança. As possibilidades são literalmente infinitas.
É por isso que a serialização é um processo tão importante no .NET e Visual básico. Abaixo está uma seção sobre serialização personalizada implementando o
ISerializable interface e codificação de Novo e um GetObjectDatasub-rotina.Como primeiro exemplo de serialização, vamos executar um dos programas mais fáceis, mas também um dos mais úteis: serializar dados e desserializar dados em classe simples para e de um arquivo. Neste exemplo, os dados não são apenas serializados, mas a estrutura dos dados também é salva. A estrutura aqui é declarada em um módulo para manter as coisas... bem... estruturada.
Módulo SerializeParms
Público Parm1Name As String = "Parm1 Name"
Parm1Value público como inteiro = 12345
Parm2Name público como string
Public Parm2Value As Decimal
Classe final
Módulo final
Em seguida, valores individuais podem ser salvos em um arquivo como este:
Sistema de Importação. Tempo de execução. Serialização. Formatadores. Binário
Sistema de Importação. IO
Public Class Form1
Private Sub mySerialize_Click (_
Remetente ByVal como sistema. Objeto, _
ByVal e As System. EventArgs) _
Lida com mySerialize. Clique
Dim ParmData As New ParmExample
ParmData. Parm2Name = "Nome Parm2"
ParmData. Parm2Value = 54321.12345
Dim s As New FileStream ("ParmInfo", FileMode. Crio)
Dim f As New BinaryFormatter
f. Serializar (s, ParmData)
s. Fechar()
End Sub
Classe final
E esses mesmos valores podem ser recuperados assim:
Sistema de Importação. Tempo de execução. Serialização. Formatadores. Binário
Sistema de Importação. IO
Public Class Form1
Sub privado myDeserialize_Click (_
Remetente ByVal como sistema. Objeto, _
ByVal e As System. EventArgs) _
Lida com myDeserialize. Clique
Dim s = Novo FileStream ("ParmInfo", FileMode. Aberto)
Dim f As New BinaryFormatter
Dim RestoredParms As New ParmExample
RestoredParms = f. Desserializar (s)
s. Fechar()
Console. WriteLine (RestoredParms. Parm1Name)
Console. WriteLine (RestoredParms. Parm1Value)
Console. WriteLine (RestoredParms. Parm2Name)
Console. WriteLine (RestoredParms. Parm2Value)
End Sub
Classe final
UMA Estrutura ou uma coleção (como um ArrayList) ao invés de um Classe também pode ser serializado para um arquivo da mesma maneira.
Agora que analisamos o processo básico de serialização, vejamos os detalhes específicos que fazem parte do processo na próxima página.
Uma das primeiras coisas que você deve observar neste exemplo é a atributo no Classe. Atributos são apenas mais informações que você pode fornecer ao VB.NET sobre um objeto e são usadas para muitas coisas diferentes. O atributo nesse código informa ao VB.NET para adicionar código extra para que, posteriormente, tudo nessa classe possa ser serializado.
Se houver itens específicos na classe que você não deseja ser serializado, você pode usar o atributo para excluí-los:
No exemplo, aviso é que Serializar e Desserializar são métodos da BinaryFormatter objeto (f neste exemplo).
f. Serializar (s, ParmData)
Este objeto pega o FileStream objeto e o objeto a ser serializado como parâmetros. Veremos que o VB.NET oferece outro objeto que permite que o resultado seja expresso como XML.
E uma nota final, se o seu objeto incluir outros objetos subordinados, eles também serão serializados! Mas desde todos objetos que são serializados devo ser marcado com o atributo, todos esses objetos filhos também devem ser marcados dessa maneira.
Para ficar completamente claro sobre o que está acontecendo no seu programa, convém exibir o arquivo chamado ParmData no Bloco de notas para ver como são os dados serializados. (Se você seguiu esse código, ele deve estar no bin. Depurar pasta no seu projeto.) Como esse é um arquivo binário, a maior parte do conteúdo não é um texto legível, mas você poderá ver qualquer sequência no seu arquivo serializado. A seguir, faremos uma versão XML e você poderá comparar as duas apenas para estar ciente da diferença.
Serializar para XML em vez de um arquivo binário requer muito poucas alterações. O XML não é tão rápido e não pode capturar algumas informações do objeto, mas é muito mais flexível. O XML pode ser usado por praticamente qualquer outra tecnologia de software no mundo atual. Se você quiser ter certeza de que suas estruturas de arquivos não "vinculam você" à Microsoft, é uma boa opção. A Microsoft está enfatizando o "LINQ to XML" para criar arquivos de dados XML em sua tecnologia mais recente, mas muitas pessoas ainda preferem esse método.
O 'X' em XML significa eXtensionável. No nosso exemplo XML, vamos usar uma dessas extensões de XML, uma tecnologia chamada SABONETE. Isso costumava significar "Protocolo Simples de Acesso a Objetos", mas agora é apenas um nome. (SOAP foi atualizado tanto que o nome original não se encaixa mais tão bem.)
O principal que precisamos alterar em nossas sub-rotinas é a declinação do formatador de serialização. Isso deve ser alterado tanto na sub-rotina que serializa o objeto quanto na que desserializa novamente. Para a configuração padrão, isso envolve três alterações no seu programa. Primeiro, você precisa adicionar uma referência ao projeto. Clique com o botão direito do mouse no projeto e selecione Adicionar referência .... Certificar-se de que ...
Sistema. Tempo de execução. Serialização. Formatadores. Sabonete
... foi adicionado ao projeto.
Altere as duas instruções no programa que faz referência a ele.
Sistema de Importação. Tempo de execução. Serialização. Formatadores. Sabonete
Dim f As New SoapFormatter
Desta vez, se você verificar o mesmo ParmData no bloco de notas, você verá que tudo está em texto XML legível, como ...
Também há muito XML adicional necessário para o padrão SOAP no arquivo. Se você deseja verificar o que o atributo, você pode adicionar uma variável a esse atributo e examinar o arquivo para verificar se ele não está incluído.
O exemplo que acabamos de codificar apenas serializou os dados, mas suponha que você precise controlar como os dados são serializados. VB.NET também pode fazer isso!
Para fazer isso, você precisa se aprofundar um pouco no conceito de serialização. O VB.NET tem um novo objeto para ajudar aqui: SerializationInfo. Embora você tenha a capacidade de codificar o comportamento de serialização personalizado, ele vem com um custo de codificação extra.
O básico extra código é mostrado abaixo. Lembre-se, esta classe é usada em vez do ParmExample classe mostrada no exemplo anterior. Este não é um exemplo completo. O objetivo é mostrar o novo código necessário para a serialização personalizada.
Sistema de Importação. Tempo de execução. Serialização
Classe pública CustomSerialization
Implementa ISerializable
'dados a serem serializados aqui
'Public SerializedVariable como Type
Public Sub - Novo ()
'construtor padrão quando a classe
'é criado - o código personalizado pode ser
adicionado aqui também
End Sub
Sub-público público (_
ByVal info Como SerializationInfo, _
Contexto ByVal como StreamingContext)
'inicialize suas variáveis de programa de
um armazenamento de dados serializado
End Sub
Public Sub GetObjectData (_
ByVal info Como SerializationInfo, _
Contexto ByVal como StreamingContext) _
Implementa ISerializable. GetObjectData
'atualize o armazenamento de dados serializado
'das variáveis do programa
End Sub
Classe final
A idéia é que agora você pode (e, de fato, você devo) faça toda a atualização e leitura de dados no armazenamento de dados serializados no Novo e GetObjectData sub-rotinas. Você também deve incluir um genérico Novo construtor (sem lista de parâmetros) porque você está implementando uma interface.
A classe normalmente terá propriedades e métodos formais codificados também ...
Propriedade genérica
Private newPropertyValue As String
Propriedade pública NewProperty () As String
Obter
Retornar newPropertyValue
End Get
Definir (valor ByVal como sequência)
newPropertyValue = value
Finalizar conjunto
Propriedade final
Método genérico
Public Sub MyMethod ()
'código do método
End Sub
A classe serializada resultante pode criar valores exclusivos no arquivo com base no código que você fornece. Por exemplo, uma classe imobiliária pode atualizar o valor e o endereço de uma casa, mas a classe também serializa uma classificação calculada de mercado.
o Novo sub-rotina será algo como isto:
Sub-público público (_
ByVal info Como SerializationInfo, _
Contexto ByVal como StreamingContext)
'inicialize suas variáveis de programa de
um armazenamento de dados serializado
Parm1Name = info. GetString ("a")
Parm1Value = info. GetInt32 ("b")
'Novo sub continua ...
Quando Desserializar é chamado em BinaryFormatter objeto, este sub é executado e um SerializationInfo objeto é passado para o Novo sub-rotina. Os novos podem fazer o que for necessário com os valores de dados serializados. Por exemplo ...
MsgBox ("Este é o Parm1Value Times Pi:" _
& (Parm1Value * Math. PI) .ToString)
O inverso acontece quando Serializar é chamado, mas o BinaryFormatter chamadas a objetos GetObjectData em vez de.
Public Sub GetObjectData (_
ByVal info Como SerializationInfo, _
Contexto ByVal como StreamingContext) _
Implementa ISerializable. GetObjectData
'atualize o armazenamento de dados serializado
'das variáveis do programa
Se Parm2Name = "Test", então
info. AddValue ("a", "Este é um teste.")
Outro
info. AddValue ("a", "Sem teste neste momento.")
Fim se
info. AddValue ("b", 2)
Observe que os dados são adicionados ao arquivo serializado como pares de nome / valor.
Muitas páginas da Web que encontrei ao escrever este artigo parecem não ter um código de trabalho real. Perguntamos se o autor realmente executou algum código antes de escrever o artigo.