Compartir a través de


Elección de un serializador

No hay ningún reemplazo de eliminación para BinaryFormatter, pero hay varios serializadores recomendados para serializar tipos de .NET. Independientemente del serializador que elija, se necesitarán cambios para la integración con el nuevo serializador. Durante estas migraciones, es importante tener en cuenta las ventajas y desventajas entre forzar el nuevo serializador para controlar los tipos existentes con el menor número de cambios posibles frente a los tipos de refactorización para habilitar la serialization idiomática con el serializador elegido. Una vez elegido un serializador, se debe estudiar su documentación para conocer los procedimientos recomendados.

Si un formato de serialization binaria no es un requisito, puede considerar el uso de formatos de serialization JSON o XML. Estos serializadores se incluyen en .NET y se admiten oficialmente.

  1. JSON con System.Text.Json
  2. XML con System.Runtime.Serialization.DataContractSerializer

Si una representación binaria compacta es importante para sus escenarios, se recomiendan los siguientes formatos de serialization y serializadores de código abierto:

  1. MessagePack con MessagePack para C#
  2. Búferes de protocolo con protobuf-net

Si tiene control para cambiar la forma de API del tipo serializado influirá en la dirección y el enfoque de la serialization. La migración a estos serializadores puede ser más sencilla con la capacidad de anotar tipos con nuevos atributos, agregar nuevos constructores, hacer públicos tipos o miembros y cambiar campos a propiedades. Sin esa capacidad, el uso de serializadores modernos podría requerir la implementación de convertidores o solucionadores personalizados.

Característica BinaryFormatter System.Text.Json DataContractSerializer MessagePack para C# protobuf-net
Formato de Serialization binario (NRBF) JSON XML binario (MessagePack) binario (Búferes de protocolo)
Representación compacta ✔️ ✔️ ✔️
Legible para el usuario ❌️ ✔️ ✔️ ❌️ ❌️
Rendimiento ❌️ ✔️ ✔️ ✔️
Compatibilidad con atributos [Serializable] ✔️ ✔️
Serialización de tipos públicos ✔️ ✔️ ✔️ ✔️ ✔️
Serialización de tipos no públicos ✔️ ✔️ ✔️ ✔️ (solucionador requerido) ✔️
Serialización de campos ✔️ ✔️ (participación) ✔️ ✔️ (atributo necesario) ✔️ (atributo necesario)
Serialización de campos no públicos ✔️ ✔️ (solucionador requerido) ✔️ ✔️ (solucionador requerido) ✔️ (atributo necesario)
Serialización de propiedades ✔️* ✔️ ✔️ ✔️ (atributo necesario) ✔️ (atributo necesario)
Deserialización de miembros de solo lectura ✔️ ✔️ (atributo necesario) ✔️ ✔️ ✔️ (constructor sin parámetros necesario)
Jerarquía de tipos polimórficos ✔️ ✔️ (atributo necesario) ✔️ ✔️ (atributo necesario) ✔️ (atributo necesario)
Soporte técnico de AOT ❌️ ✔️ ✔️ ❌ (planificado)

JSON con System.Text.Json

La biblioteca System.Text.Json es un serializador moderno que enfatiza la seguridad, el alto rendimiento y la baja asignación de memoria para el formato de notación de objetos JavaScript (JSON). JSON es legible para el usuario y tiene una amplia compatibilidad multiplataforma. Aunque el formato basado en texto no es tan compacto como los formatos binarios, su tamaño puede reducirse considerablemente mediante la compresión.

Serialization excluye miembros no públicos y de solo lectura a menos que se controlen específicamente a través de atributos y constructores. System.Text.Json también admite la serialization y deserialización personalizadas para tener más control sobre cómo se convierten los tipos en JSON y viceversa. System.Text.Json no admite el atributo [Serializable].

Migración a System.Text.Json (JSON).

XML con DataContractSerializer

DataContractSerializer se introdujo en .NET Framework 3.0 y se usa para serializar y deserializar los datos enviados en los mensajes de Windows Communication Foundation (WCF). DataContractSerializer es un serializador XML que admite completamente el modelo de programación de serialization que se utiliza en BinaryFormatter, lo que significa que respeta el atributo [Serializable] y la implementación de ISerializable. Por lo tanto, es el serializador para el que se requiere menos esfuerzo para migrar. Sin embargo, requiere que los tipos conocidos se especifiquen de antemano (pero la mayoría de las colecciones y tipos primitivos de .NET están en una lista de permitidos predeterminada y no es necesario especificarlos).

Aunque DataContractSerializer conlleva esas ventajas funcionales al migrar desde BinaryFormatter, no es tan moderna o eficaz como las otras opciones.

Migración a DataContractSerializer (XML).

Advertencia

No se debe confundir DataContractSerializer con NetDataContractSerializer. NetDataContractSerializer se identifica como un serializador peligroso.

Binario con MessagePack

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.

Migración a MessagePack (binario).

Binario con protobuf-net

La biblioteca protobuf-net es un serializador basado en contrato para .NET que usa el formato de búferes de protocoloserialization binario. La API sigue los patrones típicos de .NET y es ampliamente comparable a XmlSerializer y DataContractSerializer. Esta popular biblioteca también es rica en funciones y puede manejar tipos y campos no públicos, pero muchos escenarios requieren aplicar atributos a los miembros.

Migración a protobuf-net (binario).