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 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 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 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, 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.