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 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
yPrecio
. - 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