csharp-message-pack

Cómo serializar en formato Message Pack en C#

MessagePack Sharp es una biblioteca para C# y .NET para la serialización en formato MessagePack, un sistema binario de alta velocidad y tamaño muy compacto.

Como dice los autores de MessagePack en la descripción del proyecto, “Message Pack, It’s like JSON. but fast and small” 😉

Los dos puntos fuertes de MessagePack frente a otras alternativas de serialización son la velocidad y el tamaño compacto de los ficheros serializados.

Por un lado, MessagePack serializa los objetos en un formato binario que es más compacto que otros formatos de serialización como JSON o XML.

Además, está diseñado para ofrecer un alto rendimiento en términos de velocidad de serialización y deserialización. Utiliza técnicas de optimización para garantizar que los datos se serialicen y deserialicen de manera eficiente.

El formato MessagePack no es exclusivo de C#. Es compatible con más de 50 lenguajes, por lo que los datos serializados pueden ser compartidos con otras aplicaciones.

Podemos trabajar con el formato MessagePack desde una aplicación de C# y .NET con la biblioteca MessagePack Sharp.

messagepack-sharp-benchmark

MessagePack Sharp ofrece un montón de opciones y personalizaciones para configurar el proceso de serialización y deserialización. Consultar la documentación de la biblioteca para más información.

Cómo usar MessagePack

Podemos añadir la biblioteca a un proyecto de .NET fácilmente, a través del paquete Nuget correspondiente.

Install-Package MessagePack

Una vez agregado, se puede utilizar la biblioteca para serializar y deserializar objetos.

Aquí tenéis algunos de cómo utilizar MessagePack Sharp extraídos de la documentación de la librería.

Serialización y deserialización con atributos

La forma tradicional de emplear MessagePack Sharp es adornar nuestros objetos con atributos, que indican cómo se debe codificar el fichero binario.

using MessagePack;

[MessagePackObject]
public class EjemploObjeto
{
    [Key(0)]
    public int Id { get; set; }

    [Key(1)]
    public string Nombre { get; set; }

    [Key(2)]
    public decimal Precio { get; set; }
}

// Crear objeto
var objeto = new EjemploObjeto()
{
	Id = 1,
	Nombre = "Producto de ejemplo",
	Precio = 10.99,
};

// Serializar objeto a byte[]
var bytes = MessagePackSerializer.Serialize(objeto);

// Deserializar byte[] a objeto
var objetoDeserializado = MessagePackSerializer.Deserialize<EjemploObjeto>(bytes);

En este ejemplo

  • Creamos un objeto EjemploObjeto, que tiene tres propiedades: Id, Nombre y Precio.
  • Se serializa el objeto a un array de bytes utilizando MessagePackSerializer.Serialize.
  • Se deserializa el array de bytes a un objeto utilizando MessagePackSerializer.Deserialize.

Serialización y deserialización Contractless

Poner atributos en nuestras clases no siempre es posible, ni deseable. Así que MessagePack CSharp ofrece el modo “ContractLess”.

public class EjemploObjeto
{
    public int Id { get; set; }
    public string Nombre { get; set; }
    public decimal Precio { get; set; }
}

var objeto = new EjemploObjeto { MyProperty1 = 99, MyProperty2 = 9999 };

// Crear objeto
var objeto = new EjemploObjeto()
{
	Id = 1,
	Nombre = "Producto de ejemplo",
	Precio = 10.99,
};

// Serializar objeto a byte[]
var bytes = MessagePackSerializer.Serialize(objeto, MessagePack.Resolvers.ContractlessStandardResolver.Options);

// Deserializar byte[] a objeto
var objetoDeserializado = MessagePackSerializer.Deserialize<EjemploObjeto>(bytes);

El proceso ContractLess es un poquito más lento que usando atributos, pero las ventajas en cuanto a limpieza generalmente nos van a compensar la pérdida.

MessagePack es Open Source, y todo el código y documentación está disponible en el repositorio del proyecto en GitHub - MessagePack-CSharp