Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

KhaosDoctor

Serialização de objetos

Recommended Posts

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”;
  • As caixas de texto podem ter qualquer nome, são apenas para exibir os resultados.

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:

  • System.Runtime.Serialization.Formatters.Binary
  • System.Runtime.Serialization
  • System.Xml
  • System.IO

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);

}

Agora começa a parte divertida, vamos, primeiramente, instanciar dois objetos, um serializador que será responsável pela serialização em si e o outro será um fileStream, que será repsonsável pela criação do nosso arquivo de configurações, reparem que o objeto “serializer” precisa identificar o tipo de objeto a ser serializado, por isso temos o “typeof” e o “GetType”:


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();

        }
Reparem que


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.
Vejam o código dos botões de desserialização em binário:

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(); 
}

Tudo Feito!

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.