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 muy configurable y sus características se pueden usar para minimizar los cambios necesarios para los tipos serializados, es importante tener en cuenta las ventajas entre controlar los tipos existentes con los pocos cambios posibles frente a los tipos de refactorización para habilitar la serialización 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 serialización. 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 anular el comportamiento de serialización por defecto para un tipo específico, puede escribir convertidores personalizados.
Admite la serialización y deserialización de muchas colecciones, pero hay limitaciones. Consulte la documentación de tipos admitidos
para obtener más información sobre qué tipos y colecciones se admiten para la serialización y deserialización. Bajo ciertas condiciones, soporta la serialización 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 serialización y deserialización de jerarquías de tipos polimórficos cuando se ha optado explícitamente por los tipos mediante el 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]
en una propiedad hace que la propiedad se omita del JSON durante la serialización.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.