miércoles, 5 de octubre de 2011

Convirtiendo objetos a un arreglo de bytes y viceversa

Hola a todos, en esta entrada se mostrará el proceso para
convertir un objeto a un array de bytes y viceversa, pues esta fue
una necesidad que se me presento mientras trabajaba con sockets,
tenia que enviar cierta información, y decidi enviarla a traves de
objetos CLR, uno de los problemas de este metodo es que si existen
errores en la transmisión de datos, se lanzaría un excepcion en
el receptor ya que no podría convertir el array al objeto deseado.

En fin para realizar esto, hice uso de dos objetos:

- System.IO.MemoryStream
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

y el código es el siguiente:




[Serializable]
class Persona
{
    public string Nombre { get; set; }
    public int Edad { get; set; }

    public override string ToString()
    {
        return "Persona: >>>> " + Nombre;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Persona x = new Persona(){
            Nombre = "Sergio",
            Edad = 21
        };
        Console.WriteLine(x);
        
        byte[] xArray = ObjectToArray(x);
        Console.WriteLine("Objeto en bytes!!! ----  Existen: " + xArray.Length + "bytes");
        foreach (byte i in xArray)
        {
            Console.Write(i + " ");
        }
  // Simula un error en la transmision
  // xArray[2] = 22;
        Console.WriteLine("==============\nDe bytes a objeto");
        Persona y = ArrayToObject(xArray) as Persona;
        Console.WriteLine(y);
        Console.Read();
    }

    static byte[] ObjectToArray(object obj)
    {
        MemoryStream memoryStream = new MemoryStream();
        BinaryFormatter formatter = new BinaryFormatter();

        formatter.Serialize(memoryStream, obj);

        return memoryStream.ToArray();
    }
    static object ArrayToObject(byte[] array)
    {
        MemoryStream memoryStream = new MemoryStream(array);
        BinaryFormatter formatter = new BinaryFormatter();
        return formatter.Deserialize(memoryStream);
    }
}

Obviamente faltan controlar las excepciones, pero bueno, esa sería la idea
de como realizar esta conversión.

Uno de los problemas de hacer esto es la gran cantidad de bytes que se genera,
y justo en este momento me acabo de dar cuenta que por que esto si tengo JSON (ops)
bueno, habria que hacer comparativas a nivel de longitud de bytes, para asi ver
si JSON o un objeto como array de bytes es menos pesado.

Bueno, creo que fue una entrada bien espontanea, espero les sea de utilidad.

R.I.P. Steve

No hay comentarios:

Publicar un comentario