Share via


Reflektion jämfört med källgenerering i System.Text.Json

Den här artikeln förklarar skillnaderna mellan reflektion och källgenerering när det gäller System.Text.Json serialisering. Det ger också vägledning om hur du väljer den bästa metoden för ditt scenario.

Metadatainsamling

Om du vill serialisera eller deserialisera en typ JsonSerializer behöver du information om hur du kommer åt medlemmarna av typen. JsonSerializer behöver följande information:

  • Så här kommer du åt egenskaps getters och fält för serialisering.
  • Så här kommer du åt en konstruktor, egenskapsuppsättningar och fält för deserialisering.
  • Information om vilka attribut som har använts för att anpassa serialisering eller deserialisering.
  • Körningskonfiguration från JsonSerializerOptions.

Den här informationen kallas metadata.

Reflektion

Som standard JsonSerializer samlar metadata in vid körning med hjälp av reflektion. När du JsonSerializer måste serialisera eller deserialisera en typ för första gången samlar den in och cachelagrar dessa metadata. Processen för metadatainsamling tar tid och använder minne.

Källgenerering

Du kan också System.Text.Json använda C# -källgenereringsfunktionen för att förbättra prestanda, minska användningen av privat minne och underlätta monteringstrimning, vilket minskar appens storlek. Dessutom kan vissa reflektions-API:er inte användas i interna AOT-program, så du måste använda källgenerering för dessa appar.

Källgenerering kan användas i två lägen:

  • Metadatabaserat läge

    Under kompileringen System.Text.Json samlar du in den information som behövs för serialisering och genererar källkodsfiler som fyller I JSON-kontraktmetadata för de begärda typerna.

  • Serialiseringsoptimeringsläge (snabb sökväg)

    JsonSerializer funktioner som anpassar utdata från serialisering, till exempel namngivningsprinciper och referensbevarande, medför prestandakostnader. I serialiseringsoptimeringsläge System.Text.Json genererar optimerad serialiseringskod som använder Utf8JsonWriter direkt. Den här optimerade eller snabba sökvägskoden ökar serialiseringens dataflöde.

    Snabbsökvägsdeserialisering är inte tillgänglig för närvarande. Mer information finns i dotnet/runtime issue 55043.

Källgenerering för System.Text.Json kräver C# 9.0 eller en senare version.

Jämför funktioner

Välj reflektions- eller källgenereringslägen baserat på följande fördelar som var och en erbjuder:

Förmån Reflektion Källgenerering
(Metadatabaserat läge)
Källgenerering
(Serialiseringsoptimeringsläge)
Enklare att koda. ✔️
Enklare att felsöka. ✔️ ✔️
Stöder icke-offentliga medlemmar. ✔️ ✔️* ✔️*
Stöder alla tillgängliga serialiseringsanpassningar. ✔️
Minskar starttiden. ✔️ ✔️
Minskar användningen av privat minne. ✔️ ✔️
Eliminerar körningsreflektion. ✔️ ✔️
Underlättar storleksminskning för trimningssäkra appar. ✔️ ✔️
Ökar serialiseringsdataflödet. ✔️

* Källgeneratorn stöder vissa icke-offentliga medlemmar, till exempel interna typer i samma sammansättning. † Källgenererade kontrakt kan ändras med hjälp av API:et för kontraktsanpassning.

Förmån Reflektion Källgenerering
(Metadatabaserat läge)
Källgenerering
(Serialiseringsoptimeringsläge)
Enklare att koda. ✔️
Enklare att felsöka. ✔️
Stöder icke-offentliga åtkomster. ✔️
Stöder nödvändiga egenskaper. ✔️
Stöder init-only-egenskaper. ✔️
Minskar starttiden. ✔️ ✔️
Minskar användningen av privat minne. ✔️ ✔️
Eliminerar körningsreflektion. ✔️ ✔️
Underlättar storleksminskning för trimningssäkra appar. ✔️ ✔️
Ökar serialiseringsdataflödet. ✔️