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