Compartir a través de


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 en true 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, establezca JsonSerializerOptions.ReferenceHandler en ReferenceHandler.Preserve.

  • Serialization se puede personalizar ampliamente con contratos personalizados, desbloqueando muchos escenarios a la vez que se minimizan los cambios en los tipos serializados.