Migración a System.Text.Json (JSON)
La biblioteca de System.Text.Json
tiene como valor predeterminado resaltar el comportamiento literal, determinista y evita cualquier adivinación o interpretación en nombre del autor de la llamada. La biblioteca está diseñada intencionadamente de esta manera para la seguridad y el rendimiento. Aunque System.Text.Json
es altamente configurable y sus características se pueden usar para minimizar los cambios necesarios en los tipos serializados, es importante tener en cuenta las ventajas y desventajas entre el control de los tipos existentes con la menor cantidad de cambios posible y la refactorización de tipos para permitir la serialization idiomática y segura.
Al migrar de BinaryFormatter a System.Text.Json
, es fundamental tener en cuenta los siguientes comportamientos y opciones:
De forma predeterminada, los campos no se serializan ni deserializan mediante
System.Text.Json
, pero se pueden anotar para serialization. Como alternativa,JsonSerializerOptions.IncludeFields
puede establecerse con precaución entrue
para que incluya todos los campos públicos de los tipos que se están serializando.JsonSerializerOptions options = new() { IncludeFields = true };
De forma predeterminada, System.Text.Json omite las propiedades y los campos privados. Puede habilitar el uso de un descriptor de acceso no público en una propiedad mediante el atributo
[JsonInclude]
. La inclusión de campos privados requiere tareas adicionales no triviales.System.Text.Jsonno puede deserializar campos de solo lectura o propiedades, pero el atributo
[JsonConstructor]
se puede usar para indicar que el constructor especificado debe usarse para crear instancias del tipo en la deserialización. El constructor puede establecer los campos y propiedades de solo lectura.Para invalidar el comportamiento predeterminado de serialization de un tipo específico, puede escribir convertidores personalizados.
Admite la serialization y deserialización de muchas colecciones, pero existen limitaciones. Consulte la documentación de tipos de colección admitidos para obtener más información sobre qué tipos y colecciones son compatibles con la serialization y deserialización.
Bajo ciertas condiciones, admite la serialization y deserialización de colecciones genéricas personalizadas.
Otros tipos sin compatibilidad integrada son:
DataSet
,DataTable
,DBNull
,TimeZoneInfo
,Type
,ValueTuple
. Sin embargo, puede escribir un convertidor personalizado que admita estos tipos.Admite la serialization y deserialización de jerarquía de tipos polimórficos, donde los tipos se han habilitado explícitamente a través del atributo
[JsonDerivedType]
o el convertidor personalizado. No se admiten jerarquías de herencia abiertas y el recorrido de ida y vuelta con polimorfismo requiere identificadores de discriminador de tipos para todos los tipos derivados conocidos.El atributo
[JsonIgnore]
de una propiedad hace que la propiedad se omita en el objeto JSON durante serialization.Para conservar las referencias y administrar las referencias circulares en
System.Text.Json
, establezcaJsonSerializerOptions.ReferenceHandler
enReferenceHandler.Preserve
.Serialization se puede personalizar ampliamente con contratos personalizados, desbloqueando muchos escenarios a la vez que se minimizan los cambios en los tipos serializados.