Serialização - objetos em byte array e vice-versa

<< Click to Display Table of Contents >>

Navigation:  Funções > Serialização >

Serialização - objetos em byte array e vice-versa

Previous pageReturn to chapter overviewNext page

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

   }

}