Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Serialização existe em praticamente todas as linguagens de programação existentes, a diferença é o modo como ela salva as informações, porém, no geral, serialização é pegar um objeto qualquer e transformá-lo em um documento XML ou Binário e salvar este arquivo aonde você preferir, em palavras é bem simples dizer isto.
No framework .NET, a serialização fica por conta do namespaceSystem.Runtime.Serialization, porém ele só serializa em formato XML, para serializar em outros formatos, como o binário, você precisa importar uma outra classe que chamam de System.Runtime.Serialization.Formatters.Binary, porém o output é basicamente o mesmo, o que difere é o modo de arquivo, mas o legal mesmo é você poder criar uma extensão de arquivo que é unica da sua aplicação.
Serializando em XML:
Vou fazer um pequeno tutorial pra galera que quiser aprender isso.
Bom, o primeiro passo para você serializar qualquer coisa é ter um objeto-classe, pode ser um módulo, uma classe, uma interface, qualquer coisa, mas todo o conteúdo PRECISA estar dentro dele. Pense nesse objeto como o banco de dados, dentro dele você precisará criar os campos e as colunas certo? Para isso vamos dizer que as colunas e os campos são um só, definidos separadamente.
Você pode criar uma coluna como sendo uma propriedade (definindo como Property [ou no C# Public <tipo>]), você pode criar variáveis, arrays, vetores, o que você quiser e ai o sistema serializa tudo em um só arquivo.
Vou fazer um sistema simples, ele vai ter quatro botões e duas textboxes, disponha-os da maneira como achar melhor.
Propriedades dos objetos
- O primeiro botão terá como texto: “Serializar XML”;
- o segundo: “Desserializar XML”;
- o terceiro: “Serializar Binário”;
- o quarto: “Desserializar binário”;
Depois de ter criado os seus botões, crie uma classe, chame-a de “Teste”. Assim que o formulário em branco abrir ele deve estar mais ou menos assim:
Public Class Teste
End Class
A fim de podermos serializar qualquer coisa precisamos dizer para o sistema que o objeto é de fato serializável, para isso vamos colocar a seguinte tag no topo:
<Serializable()>
Public Class Teste
End Class
C#:
[Serializable]
public class Teste {
}
Agora vamos criar os nossos objetos, neste tutorial eu vou apenas armazenar um nome e um numero, nada mais. Vamos fazer o seguinte, criaremos as variáveis globais “_nome” e “_num”, após vamos criar as propriedades “Nome” e “Numero”:
VB
<Serializable()>
Public Class Teste
Public _nome as String
Public _num as Integer
End Class
C#
[Serializable]
public class Teste {
private String _nom;
private int _num;
}
Agora as propriedades
VB
<Serializable()>
Public Class Teste
Public _nome as String
Public _num as Integer
Public Property Nome As String
Get
Return _nome
End Get
Set(value As String)
_nome = value
End Set
End Property
Public Property Numero As Integer
Get
Return _num
End Get
Set(value As Integer)
_num = value
End Set
End Property
End Class
C#
[Serializable]
public class Teste
{
private string _nome;
private int _num;
public String Nome
{
get { return _nome; }
set { _nome = value; }
}
public int Numero
{
get { return _num; }
set { _num = value; }
}
}
Agora que definimos nossas propriedades, vamos ao nosso formulário principal, abra-o e clique duas vezes sobre o botão “Serializar XML”, feito isso vamos importar as bibliotecas necessárias, que são:
VB
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Runtime.Serialization
Imports System.Xml
Public Class Form1
Private Sub Button1_click(sender as Object, e as System.EventArgs) Handles Button1.Click
End Sub
End Class
C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.IO;
using System.Xml;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
}
}
}
Agora vamos ao código deste botão, vamos pegar o que está escrito no textbox de número 1 e vamos jogar para a propriedade “Nome”, vamos fazer o mesmo com o número 2 e jogar para a propriedade “Numero”, mas antes precisamos instanciar uma nova classe, então no topo de tudo isso, abaixo da declaração de classe do Form1 vamos instanciar a classe Teste:
VB
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Runtime.Serialization
Imports System.Xml
Public Class Form1
Dim Data as New Teste()
Private Sub Button1_click(sender as Object, e as System.EventArgs) Handles Button1.Click
End Sub
End Class
C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.Xml;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
Teste Data = new Teste();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
}
}
}
Agora que instanciamos toda a classe podemos partir para a serialização, vamos fazer o código do botão “Serializar XML”.
Botão 1 - Serializar XML
Primeiro vamos dizer que o que está escrito no textbox 1 e 2 deve ir respectivamente para as propriedades Nome e Numero, isso é bem simples:
VB
Private Sub Button1_click(sender as Object, e as System.EventArgs) Handles Button1.Click
Data.Nome = TextBox1.Text
Data.Numero = Convert.ToInt32(TextBox2.Text)
End Sub
C#
private void button1_Click(object sender, EventArgs e)
{
Data.Nome = textBox1.Text;
Data.Numero = Convert.ToInt32(textBox2.Text);
}VB
Private Sub Button1_click(sender as Object, e as System.EventArgs) Handles Button1.Click
Data.Nome = TextBox1.Text
Data.Numero = Convert.ToInt32(TextBox2.Text)
Dim serializer As New Serialization.XmlSerializer(GetType(Teste))
Dim DataFile As New FileStream("C:/Serialization.ser", FileMode.Create, FileAccess.Write, FileShare.None)
End Sub
C#
private void button1_Click(object sender, EventArgs e)
{
Data.Nome = textBox1.Text;
Data.Numero = Convert.ToInt32(textBox2.Text);
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(Teste));
FileStream DataFile = new FileStream("C:/Serialization.ser", FileMode.Create, FileAccess.Write, FileShare.None);
}
Você pode definir o caminho do FileStream da maneira que preferir, assim como a extensão do arquivo, neste exemplo eu estou criando um arquivo chamado Serialization, do tipo .ser no drive C:/, mas você pode, por exemplo, criar um arquivo chamado “Sorvete.pipoca” em qualquer lugar, eu aconselho o uso da pasta AppData/Roaming, que é especifica para o armazenamento de arquivos de aplicativos, em cada computador o caminho desta pasta é diferente, mas você pode buscá-lo fazendo isto:
VB
Dim appdata As String = System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
C#
String appdata = System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
Se você quiser criar uma pasta dentro desta pasta para sua aplicação você vai precisar também de uma pequena função para verificar a existencia desta pasta, caso não exista ele criará para você, para isto basta:
VB
Dim folder As System.IO.DirectoryInfo = New DirectoryInfo(appdata & "<seucaminho>")
If Not folder.Exists Then
folder.Create()
End If
C#
System.IO.DirectoryInfo folder = new System.IO.DirectoryInfo.DirectoryInfo(appdata + "<seucaminho>");
if (!(folder.Exists)) { folder.Create(); }
Agora vamos de fato serializar o objeto e salvá-lo no arquivo, zerando a classe Teste:
VB
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Data.Nome = TextBox1.Text
Data.Numero = Convert.ToInt32(TextBox2.Text)
Dim serializer As New Serialization.XmlSerializer(GetType(Teste))
Dim DataFile As New FileStream("C:/Serial.ser", FileMode.Create, FileAccess.Write, FileShare.None)
serializer.Serialize(DataFile, Data)
DataFile.Close()
Data = Nothing
End Sub
C#
private void button1_Click(object sender, EventArgs e)
{
Data.Nome = textBox1.Text;
Data.Numero = Convert.ToInt32(textBox2.Text);
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(Teste));
FileStream DataFile = new FileStream("C:/Serialization.ser", FileMode.Create, FileAccess.Write, FileShare.None);
serializer.Serialize(DataFile, Data);
DataFile.Close();
Data = null;
}
Pronto, serializamos o nosso arquivo, agora se você for no caminho definido e olhar bem, haverá um arquivo com o nome que você especificou, abra-o com o bloco de notas e veja a mágica!
Desserializando
Para desserializar é basicamente a mesma coisa, vamos começar criando um objeto desserializador e um FileStream que irá abrir o arquivo:
VB
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Dim desserializer As New Serialization.XmlSerializer(GetType(Teste))
Dim DataFile As New FileStream("C:/Serial.ser", FileMode.Open, FileAccess.Read, FileShare.None)
End Sub
C#
private void button2_Click(object sender, EventArgs e)
{
System.Xml.Serialization.XmlSerializer desserializer = new System.Xml.Serialization.XmlSerializer(typeof(Teste));
FileStream DataFile = new FileStream("C:/Serialization.ser", FileMode.Open, FileAccess.Read, FileShare.None);
}
Agora vamos pedir para este objeto desserializar o nosso arquivo:
VB
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Dim desserializer As New Serialization.XmlSerializer(GetType(Teste))
Dim DataFile As New FileStream("C:/Serial.ser", FileMode.Open, FileAccess.Read, FileShare.None)
Data = CType(desserializer.Deserialize(DataFile), Teste)
DataFile.Close()
TextBox1.Text = Data.Nome
TextBox2.Text = Data.Numero.ToString
End Sub
C#
private void button2_Click(object sender, EventArgs e)
{
System.Xml.Serialization.XmlSerializer desserializer = new System.Xml.Serialization.XmlSerializer(typeof(Teste));
FileStream DataFile = new FileStream("C:/Serialization.ser", FileMode.Open, FileAccess.Read, FileShare.None);
Data = (Teste)desserializer.Deserialize(DataFile);
DataFile.Close();
textBox1.Text = Data.Nome;
textBox2.Text = Data.Numero.ToString();
}No VB usamos a declaração CType(obj,obj) que é na verdade uma conversão instantânea de um objeto para outro tipo de objeto, neste caso um documento XML para a classe Teste. O equivalente para este comando no C# é o (obj) que transforma tudo que está depois dos “()” no objeto descrito dentro deles, mas não fiquem animados, isto não funciona para todas as coisas, ainda teremos problemas de conversão :(
Agora testem o programa, para um teste mais legal que mostre todas as possibilidades da serialização façam o seguinte: Abram o teste no debug do Visual Studio, coloquem um nome e um número nas caixas de texto, depois apertem o botão Serializar XML, fechem o debug, isso mesmo, deem stop no debug do IDE, agora testem novamente porém, ao invés de colocar o nome e o número, cliquem direto no botão desserializar e ele vai pegar o nome e o número que você colocou na sessão anterior mostrando nas caixas de texto, legal não é?
Serializando em Binário
A única coisa que se altera da serialização em XML para o binário, no código, é que ao invés de declararmos nossos serializadores e desserializadores como XMLSerializer, vamos declará-los como BinaryFormatter(), então para o botão “Serializar Binário” vocês podem copiar o código do botão “Serializar XML” e substituir [inline]System.Xml.Serialization.XmlSerializer(typeof(Teste));[/inline] (ou no VB [inline]Serialization.XmlSerializer(GetType(Teste))[/inline]) por “BinaryFormatter()”:
VB
Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
Data.Nome = TextBox1.Text
Data.Numero = Convert.ToInt32(TextBox2.Text)
Dim serializer As New BinaryFormatter()
Dim DataFile As New FileStream("C:/Serial.sbin", FileMode.Create, FileAccess.Write, FileShare.None)
serializer.Serialize(DataFile, Data)
DataFile.Close()
Data = Nothing
End Sub
C#
private void button3_Click(object sender, EventArgs e)
{
Data.Nome = textBox1.Text;
Data.Numero = Convert.ToInt32(textBox2.Text);
BinaryFormatter serializer = new BinaryFormatter();
FileStream DataFile = new FileStream("C:/Serialization.sbin", FileMode.Create, FileAccess.Write, FileShare.None);
serializer.Serialize(DataFile, Data);
DataFile.Close();
Data = null;
}
E para o outro botão a mesma coisa, mas lembrem-se de dar extensões de arquivos diferentes para cada tipo de serialização, assim vocês podem ver as diferenças entre um e outro. Os tipos originais seriam .xml e .bin, mas, como o conteúdo vai ser o mesmo, não importa o que você vai colocar como extensão, pois o FileStream vai ler para a memória mesmo assim.VB
Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
Dim desserializer As New BinaryFormatter()
Dim DataFile As New FileStream("C:/Serial.sbin", FileMode.Open, FileAccess.Read, FileShare.None)
Data = CType(desserializer.Deserialize(DataFile), Teste)
DataFile.Close()
TextBox1.Text = Data.Nome
TextBox2.Text = Data.Numero.ToString
End Sub
C#
private void button4_Click(object sender, EventArgs e) {
BinaryFormatter desserializer = new BinaryFormatter();
FileStream DataFile = new FileStream("C:/Serialization.ser", FileMode.Open, FileAccess.Read, FileShare.None);
Data = (Teste)desserializer.Deserialize(DataFile);
DataFile.Close();
textBox1.Text = Data.Nome;
textBox2.Text = Data.Numero.ToString();
}Bom galera, deixo esse ensinamento hoje para vocês aqui, espero que vocês possam usufruir deste recurso o tanto que eu estou, há infinitas possibilidades para o uso de serialização (especialmente se você não gosta de trabalhar com bancos de dados) é só você descobrir :D
Até mais!