MemoryPack: serializador binario sin codificación para C# y Unity

Fuentes: MemoryPack: zero-encoding binary serializer for C# and Unity

MemoryPack es una biblioteca de serialización binaria para C# y Unity que prescinde de operaciones de codificación (VarInt, etiquetas, cadenas, etc.) y, en su lugar, copia directamente la memoria de los objetos de C#. Este enfoque, conocido como zero-encoding y similar al de FlatBuffers aunque sin requerir un tipo especial —su objetivo son los POCO—, se traduce en un rendimiento muy superior al de otras soluciones: en objetos estándar es entre 10 y 5 veces más rápido que System.Text.Json, protobuf-net, MessagePack for C# y Orleans.Serialization, y en arrays de structs可以达到 50 a 200 veces más velocidad, según mediciones realizadas en .NET 7 sobre un Ryzen 9 5950X.

El autor, Yoshifumi Kawai, es el creador de ZeroFormatter, Utf8Json y MessagePack for C#, y aplica en MemoryPack la experiencia acumulada en esos proyectos. La biblioteca aprovecha .NET 7, C# 11 y el Incremental Source Generator, con compatibilidad con .NET Standard 2.1 (.NET 5 y 6) y soporte para Unity 2021.3 con IL2CPP mediante generador de código fuente para .NET.

Además del rendimiento, MemoryPack ofrece un conjunto amplio de funciones pensadas para integrarse con la plataforma moderna de .NET: soporta las APIs I/O actuales (IBufferWriter, ReadOnlySpan, ReadOnlySequence); genera código nativo compatible con AOT sin Dynamic CodeGen (IL.Emit); expone APIs sin reflexión y sin genéricos; permite deserializar sobre instancias existentes; gestiona polimorfismo mediante Union; ofrece tolerancia de versiones tanto rápida (por defecto) como completa; serializa referencias circulares; incorpora streaming basado en PipeWriter/PipeReader; genera código TypeScript y formateadores para ASP.NET Core; e incluye diagnóstico mediante 35 reglas (MEMPACK001-MEMPACK035).

El uso básico consiste en marcar la clase o struct con [MemoryPackable] y la palabra clave partial; el código de serialización se genera automáticamente implementando IMemoryPackable. Se distribuye vía NuGet y requiere, para máximo rendimiento, .NET 7; el mínimo es .NET Standard 2.1. Para Unity, los requisitos y la instalación son distintos y se detallan en la documentación de la propia biblioteca.