CA1869: Almacenamiento en caché y reutilización de instancias de "JsonSerializerOptions"

Propiedad Value
Identificador de la regla CA1869
Título Almacenamiento en caché y reutilización de instancias de "JsonSerializerOptions"
Categoría Rendimiento
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 Como sugerencia

Causa

Una instancia local de JsonSerializerOptions se usa una vez como argumento options de una llamada Serialize o Deserialize.

Descripción de la regla

El uso de una instancia local de JsonSerializerOptions para la serialización o deserialización puede degradar considerablemente el rendimiento de la aplicación si el código se ejecuta varias veces, ya que System.Text.Json almacena internamente en caché metadatos relacionados con la serialización en la instancia proporcionada.

Cómo corregir infracciones

Puede usar el patrón singleton para evitar crear una nueva instancia JsonSerializerOptions cada vez que se ejecuta el código.

Ejemplo

En el siguiente fragmento de código se muestran dos infracciones de la regla CA1869:

static string Serialize<T>(T value)
{
    JsonSerializerOptions jsonOptions = new()
    {
        WriteIndented = true
    };

    return JsonSerializer.Serialize(value, jsonOptions);
}

static T Deserialize<T>(string json)
{
    return JsonSerializer.Deserialize<T>(json, new JsonSerializerOptions { AllowTrailingCommas = true });
}

El siguiente fragmento de código corrige las infracciones:

private static readonly JsonSerializerOptions s_writeOptions = new()
{
    WriteIndented = true
};

private static readonly JsonSerializerOptions s_readOptions = new()
{
    AllowTrailingCommas = true
};

static string Serialize<T>(T value)
{
    return JsonSerializer.Serialize(value, s_writeOptions);
}

static T Deserialize<T>(string json)
{
    return JsonSerializer.Deserialize<T>(json, s_readOptions);
}

Si hay más llamadas a Serialize o Deserialize, s_writeOptions o s_readOptions se debe reutilizar, respectivamente.

Cuándo suprimir las advertencias

Es seguro suprimir esta advertencia si sabe que el código no creará instancias de una instancia de JsonSerializerOptions más de una vez.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

#pragma warning disable CA1869
// The code that's violating the rule is on this line.
#pragma warning restore CA1869

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none del archivo de configuración.

[*.{cs,vb}]
dotnet_diagnostic.CA1869.severity = none

Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.