|
<< Click to Display Table of Contents >> Serialização - objetos em byte array e vice-versa |
![]() ![]()
|
Introdução
Exemplo de como converter um Objeto em um byte[] que pode ser usado para gravar em arquivo, enviar por sockets...
Using geral
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
Saída
Original:
Zelda Williams, 30, Mulher
Serializado:
☺ ????☺ ♀☻ JConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null♣☺ ♠Pessoa♥ §<Nome>k__BackingField▬<Idade>k__BackingField↨<Genero>k__BackingField☺♦Tipo☻ ☻ ♠♥
♫Zelda Williams▲ ♣????♦Tipo☺ value__☻ ☺ ♂
Desserializado:
Zelda Williams, 30, Mulher
Classe utilitária para serializar o objeto
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
public static class Funcao
{
public static byte[] ConverteObjectEmByte(Object obj)
{
if (obj == null)
return null;
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
//cria um array de bytes através do objeto obj
bf.Serialize(ms, obj);
//recebe o array referente ao objeto obj
byte[] ret = ms.ToArray();
return ret;
}
public static Object ConverteByteEmObject(byte[] bytes)
{
MemoryStream memStream = new MemoryStream();
BinaryFormatter binForm = new BinaryFormatter();
//grava na stream o array de bytes passado como parâmetro
memStream.Write(bytes, 0, bytes.Length);
//modifica a posição de início da stream (posição zero)
memStream.Seek(0, SeekOrigin.Begin);
//converte a stream em um object
Object obj = (Object)binForm.Deserialize(memStream);
return obj;
}
}
Classe a ser serializada
enum Tipo
{
Homem, Mulher
}
// aqui o pulo do gato - não esqueça do serializable
[Serializable]
class Pessoa
{
public string Nome { get; set; }
public int Idade { get; set; }
public Tipo Genero { get; set; }
public Pessoa(string nome, int idade, Tipo genero)
{
this.Nome = nome;
this.Idade = idade;
this.Genero = genero;
}
public override string ToString()
{
return Nome + ", " + Idade.ToString() + ", " + (Genero == Tipo.Homem ? " Homem" : " Mulher");
}
}
Exemplo principal
class Program
{
static void Main(string[] args)
{
Pessoa zelda = new Pessoa("Zelda Williams", 30, Tipo.Mulher);
// exibe objetos
Console.WriteLine("Original:");
Console.WriteLine(zelda);
Console.WriteLine('\n');
// gravar em arquivo
FileStream file = new FileStream("d:\\sample.dat", FileMode.Create);
BinaryWriter bw = new BinaryWriter(file);
byte[] byt = Funcao.ConverteObjectEmByte(zelda);
bw.Write(byt);
bw.Close();
Console.WriteLine("Serializado:");
ASCIIEncoding enc = new ASCIIEncoding();
string st = enc.GetString(byt);
Console.WriteLine(st);
Console.WriteLine('\n');
// para converter o st de volta para byte[]:
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] x = encoding.GetBytes(st);
// vamos ler do arquivo
file = new FileStream("d:\\sample.dat", FileMode.Open);
BinaryReader br = new BinaryReader(file);
Pessoa p = (Pessoa)Funcao.ConverteByteEmObject(br.ReadBytes(byt.Length));
Console.WriteLine("Desserializado:");
Console.WriteLine(p);
Console.ReadLine();
}
}