Källgenereringslägen i System.Text.Json

Källgenerering kan användas i två lägen: metadatabaserad och serialiseringsoptimering. I den här artikeln beskrivs de olika lägena.

Information om hur du använder källgenereringslägen finns i Så här använder du källgenerering i System.Text.Json.

Metadatabaserat läge

Du kan använda källgenerering för att flytta processen för metadatainsamling från körningstid till kompileringstid. Under kompilering samlas metadata in och källkodsfiler genereras. De genererade källkodsfilerna kompileras automatiskt som en integrerad del av programmet. Den här tekniken eliminerar insamling av metadata för körning, vilket förbättrar prestanda för både serialisering och deserialisering.

Prestandaförbättringarna som tillhandahålls av källgenereringen kan vara betydande. Testresultat har till exempel visat upp till 40 % eller mer minskning av starttiden, minskning av privat minne, ökning av dataflödeshastigheten (i serialiseringsoptimeringsläge) och minskning av appstorleken.

Kända problem

Endast public egenskaper och fält stöds som standard i antingen serialiseringsläge. Reflektionsläget stöder dock användning av privateaccessorer, medan källgenereringsläget inte gör det. Du kan till exempel använda attributet JsonInclude på en egenskap som har en private setter eller getter och som kommer att serialiseras i reflektionsläge. Källgenereringsläget stöder endast public eller internal åtkomst till public egenskaper. Om du ställer in [JsonInclude] på icke-offentliga accessorer och väljer källgenereringsläge genereras ett NotSupportedException vid körning.

Endast public egenskaper och fält stöds som standard i antingen serialiseringsläge. Reflektionsläget stöder dock användning av private medlemmar och privateaccessorer, medan källgenereringsläget inte gör det. Om du till exempel använder attributet JsonInclude för en private egenskap eller en egenskap som har en private setter eller getter, kommer den att serialiseras i reflektionsläge. Källgenereringsläget stöder endast public eller internal medlemmar och public eller internal åtkomst till public egenskaper. Om du ställer in [JsonInclude]private medlemmar eller accessorer och väljer källgenereringsläge genereras ett NotSupportedException vid körning.

Information om andra kända problem med källgenerering finns i GitHub-problem som är märkta med "källgenerator"dotnet/runtime-lagringsplatsen .

Serialiseringsoptimeringsläge (snabb sökväg)

JsonSerializer har många funktioner som anpassar utdata från serialisering, till exempel namngivningsprinciper och bevarande av referenser. Stöd för alla dessa funktioner orsakar vissa prestandakostnader. Källgenerering kan förbättra serialiseringsprestanda genom att generera optimerad kod som använder Utf8JsonWriter direkt.

Den optimerade koden stöder inte alla serialiseringsfunktioner som JsonSerializer stöds. Serialiseraren identifierar om den optimerade koden kan användas och återgår till standardserielliseringskoden om alternativ som inte stöds har angetts. Det är till exempel JsonNumberHandling.AllowReadingFromString inte tillämpligt för skrivning, så om du anger det här alternativet blir standardkoden inte standardkod om du anger det här alternativet.

I följande tabell visas vilka alternativ som JsonSerializerOptions stöds av serialisering med snabb sökväg:

Serialiseringsalternativ Stöds för snabbsökväg
AllowTrailingCommas ✔️
Converters
DefaultBufferSize ✔️
DefaultIgnoreCondition ✔️
DictionaryKeyPolicy
Encoder
IgnoreNullValues
IgnoreReadOnlyFields ✔️
IgnoreReadOnlyProperties ✔️
IncludeFields ✔️
MaxDepth ✔️
NumberHandling
PropertyNamingPolicy ✔️
ReferenceHandler
TypeInfoResolver ✔️
WriteIndented ✔️

(Följande alternativ stöds inte eftersom de endast gäller för serialisering: PropertyNameCaseInsensitive, ReadCommentHandlingoch UnknownTypeHandling.)

I följande tabell visas vilka attribut som stöds av serialisering med snabb sökväg:

Attribut Stöds för snabbsökväg
JsonConstructorAttribute
JsonConverterAttribute
JsonDerivedTypeAttribute ✔️
JsonExtensionDataAttribute
JsonIgnoreAttribute ✔️
JsonIncludeAttribute ✔️
JsonNumberHandlingAttribute
JsonPolymorphicAttribute ✔️
JsonPropertyNameAttribute ✔️
JsonPropertyOrderAttribute ✔️
JsonRequiredAttribute ✔️

Om ett alternativ eller attribut som inte stöds anges för en typ återgår serialiseraren till metadataläge, förutsatt att källgeneratorn har konfigurerats för att generera metadata. I så fall används inte den optimerade koden vid serialisering av den typen, utan kan användas för andra typer. Därför är det viktigt att utföra prestandatestning med dina alternativ och arbetsbelastningar för att avgöra hur stor nytta du faktiskt kan få av serialiseringsoptimeringsläget. Möjligheten att återgå till JsonSerializer kod kräver dessutom metadatainsamlingsläge. Om du bara väljer serialiseringsoptimeringsläge kan serialiseringen misslyckas för typer eller alternativ som måste återgå till JsonSerializer koden.

Se även