Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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 standardläge samlar JsonSerializer in metadata vid körning med hjälp av reflection. 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.Jsonsamlar 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
Utf8JsonWriterdirekt. 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.
Note
F#-stöd för diskriminerade fackföreningar fungerar endast i reflektionsläge. Det kräver dynamisk kod och metadata för otrimmad reflektion. Du kan inte använda den med källgenerering eller intern AOT. Mer information finns i F#-diskriminerade fackföreningar.
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öd [JsonInclude] för icke-offentliga medlemmar. |
✔️ | ✔️* | ✔️* |
| Stöder alla tillgängliga serialiseringsanpassningar. | ✔️ | ❌ † | ❌ † |
| Minskar starttiden. | ❌ | ✔️ | ✔️ |
| Minskar användningen av privat minne. | ❌ | ✔️ | ✔️ |
| Eliminerar körtidsreflektion. | ❌ | ✔️ | ✔️ |
| Underlättar storleksminskning för trimningssäkra appar. | ❌ | ✔️ | ✔️ |
| Ökar serialiseringsdataflödet. | ❌ | ❌ | ✔️ |
* Från och med .NET 11 stöder källgenerering private, internal och protected-medlemmar som du explicit markerar med [JsonInclude]. Den stöder också åtkomstmetoderna private, internal och protected på de egenskaper som du markerar med [JsonInclude]. Metadatabaserad källgenerering stöder otillgängliga konstruktorer som du markerar med [JsonConstructor]. Genererade setters körs endast för init-only-egenskaper som visas i JSON, så utelämnade egenskaper behåller sina initialiserarvärden. I .NET 10 och tidigare versioner stöder källgenerering inte medlemmar eller åtkomstmetoder med private eller protected, eller otillgängliga konstruktorer. Den genererade kontexten kan endast komma åt internal medlemmar och användare när de delar en sammansättning. Mer information finns i Icke-offentliga medlemmar och konstruktorer.
† Använd API:et för kontraktsanpassning för att ändra källgenererade kontrakt.