Início > .NET > Serializando Objetos em C#

Serializando Objetos em C#

Como estou estudando um pouco sobre Redes de Computadores (desenvolvendo um jogo multiplayer em Rede com XNA!), a técnica de Serialização de Objetos é fundamental.

Serializar é importante quando queremos enviar através de uma rede, um conjunto de dados (objetos), como por exemplo, a posição de um personagem na tela do jogo.

De início, criaremos uma função para converter Objetos em um Array de bytes:

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

Após isso, criamos outra função que converte Bytes em Objetos (desfaz a converção inicial):

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

Agora vamos criar uma Classe Livro para ser serializada:

[Serializable]
public class Livro
{
	public int id;
	public string titulo;

	public Livro(string titulo, int id)
	{
		this.id = id;
		this.titulo = titulo;
	}
}

Note a propriedade [Serializable]. Ela indica que a classe pode ser serializada.
Agora vamos usar o conceito de Leitura e Escrita de Arquivos Binários que vimos anteriormente:

static void Main(string[] args)
{
	FileStream file = new FileStream("bw.dat", FileMode.Create);
	BinaryWriter bw = new BinaryWriter(file);

	Livro livro = new Livro("Loucos", 100);

	byte[] byt = ConverterObjectEmByte(livro);

	bw.Write(byt);

	bw.Close();

	file = new FileStream("bw.dat", FileMode.Open);

	BinaryReader br = new BinaryReader(file);

	Livro liv = (Livro) ConverterByteEmObject(br.ReadBytes(byt.Length));

	Console.WriteLine(liv.titulo);
	Console.ReadLine();
}

Proto! Foi bem fácil. Caso queira saber mais sobre a classe MemoryStream utilizadas, dê uma olhada na documentação no site do MSDN.
E como utilizar isso para enviar um objeto através de uma rede?
Voltando ao tutorial de Sockets em C#, é só alterarmos o método Run() do Servidor e do Cliente, para que eles mandem um objeto convertido em um array de bytes, ao invés de uma string, como fizemos antes.
Download do Projeto

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;
}
Anúncios
Categorias:.NET
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: