Share via


CA1869: Cachelagrar och återanvänder "JsonSerializerOptions"-instanser

Property Värde
Regel-ID CA1869
Title Cachelagrar och återanvänder "JsonSerializerOptions"-instanser
Kategori Prestanda
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

En lokal instans av JsonSerializerOptions används en gång som argument för options ett eller Deserialize ett Serialize anrop.

Regelbeskrivning

Om du använder en lokal instans av JsonSerializerOptions för serialisering eller deserialisering kan det avsevärt försämra programmets prestanda om koden körs flera gånger eftersom System.Text.Json internt cachelagrar serialiseringsrelaterade metadata i den angivna instansen.

Så här åtgärdar du överträdelser

Du kan använda singleton-mönstret för att undvika att skapa en ny JsonSerializerOptions instans varje gång koden körs.

Exempel

Följande kodfragment visar två överträdelser av 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 });
}

Följande kodfragment åtgärdar överträdelserna:

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);
}

Om det finns ytterligare anrop till Serialize eller Deserialize, s_writeOptions eller s_readOptions ska återanvändas.

När du ska ignorera varningar

Det är säkert att ignorera den här varningen om du vet att koden inte instansierar en JsonSerializerOptions-instans mer än en gång.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.