Migración a MessagePack (binario)
MessagePack es un formato de serialization compacta que permite reducir el tamaño de los mensajes en comparación con JSON y XML. La biblioteca de código abierto MessagePack para C# es muy eficaz y ofrece una compresión LZ4 ultra rápida integrada para reducir aún más el tamaño de los datos. Funciona mejor cuando los tipos de datos se anotan con DataContractSerializer
o con los propios atributos de la biblioteca. Se puede configurar para admitir entornos AOT, tipos y miembros no públicos y tipos y miembros de solo lectura.
Algunos comportamientos y características de MessagePack para C# serán importantes durante las migraciones de BinaryFormatter, especialmente si no se pueden realizar cambios en las API de los tipos serializados o es necesario minimizarlos.
De forma predeterminada, solo los tipos públicos son serializables. Las estructuras y clases privadas e internas solo se pueden serializar cuando se proporciona
StandardResolverAllowPrivate.Options
como argumento para los métodosMessagePackSerializer.Serialize
yMessagePackSerializer.Deserialize
.MessagePack requiere que cada tipo serializable se anote con el atributo
[MessagePackObject]
. Es posible evitarlo mediante el uso del ContractlessStandardResolver, pero podría causar problemas con el control de versiones en el futuro.Todos los campos no estáticos serializables y una propiedad deben anotarse con el atributo
[Key]
. Si anota el tipo con el atributo[MessagePackObject(keyAsPropertyName: true)]
, los miembros no requieren anotaciones explícitas. En tal caso, para omitir determinados miembros públicos, use el atributo[IgnoreMember]
.Para serializar miembros privados, use StandardResolverAllowPrivate.
Las anotaciones de
System.Runtime.Serialization
se pueden usar en lugar de anotaciones de MessagePack:[DataContract]
en lugar de[MessagePackObject]
,[DataMember]
en lugar de[Key]
y[IgnoreDataMember]
en lugar de[IgnoreMember]
. Estas anotaciones pueden ser útiles si desea evitar una dependencia de MessagePack en la biblioteca que define los tipos serializables.Admite tipos y miembros de solo lectura o inmutables. El serializador intentará usar el constructor público con la mejor lista de argumentos coincidentes. El constructor se puede especificar de forma explícita mediante el atributo
[SerializationConstructor]
.Serialization de tipos arbitrarios se admiten a través de formateadores personalizados que son fáciles de crear. Esto quita todos los requisitos de atributos y patrones de constructor o miembro específicos.
El serializador admite los tipos y colecciones integrados de uso más frecuente proporcionados por las bibliotecas de clase base de .NET. Puede encontrar la lista completa en los documentos oficiales. Tiene puntos de extensión que permiten la personalización.
Advertencia
MessagePack tiene API para permitir la deserialización de datos sin restricciones de tipo. Según las Notas de seguridad de MessagePack, se deben evitar estas API.
Advertencia
Algunas API de MessagePack tienen un comportamiento personalizable a través de estáticas mutables, lo que significa que su código puede tener éxito o fallar en función de lo que otro código en el mismo proceso, AssemblyLoadContext o AppDomain podría hacer. Puede mantener el código resistente haciendo referencia también al paquete MessagePackAnalyzer y activando los analizadores MsgPack001 y MsgPack002, que llaman a cualquier uso de API con comportamiento cambiante.