Weerspiegeling versus brongeneratie in System.Text.Json
In dit artikel worden de verschillen tussen reflectie en brongeneratie uitgelegd, omdat het betrekking heeft op System.Text.Json
serialisatie. Het biedt ook richtlijnen voor het kiezen van de beste benadering voor uw scenario.
Metagegevensverzameling
Als u een type wilt serialiseren of deserialiseren, JsonSerializer hebt u informatie nodig over de toegang tot de leden van het type. JsonSerializer
heeft de volgende informatie nodig:
- Toegang krijgen tot eigenschaps getters en velden voor serialisatie.
- Toegang krijgen tot een constructor, eigenschapssetters en velden voor deserialisatie.
- Informatie over welke kenmerken zijn gebruikt om serialisatie of deserialisatie aan te passen.
- Runtime-configuratie van JsonSerializerOptions.
Deze informatie wordt metagegevens genoemd.
Reflectie
Verzamelt standaard JsonSerializer metagegevens tijdens runtime met behulp van weerspiegeling. Wanneer JsonSerializer
een type voor het eerst moet worden geserialiseerd of gedeserialiseerd, worden deze metagegevens verzameld en in de cache opgeslagen. Het verzamelingsproces voor metagegevens neemt tijd in beslag en gebruikt geheugen.
Brongeneratie
Als alternatief System.Text.Json
kunt u de functie voor het genereren van C#-bronnen gebruiken om de prestaties te verbeteren, het gebruik van privégeheugen te verminderen en assembly's te beperken, waardoor de app kleiner wordt. Bovendien kunnen bepaalde reflectie-API's niet worden gebruikt in systeemeigen AOT-toepassingen, dus u moet brongeneratie gebruiken voor deze apps.
Brongeneratie kan in twee modi worden gebruikt:
Modus op basis van metagegevens
Verzamelt tijdens de compilatie
System.Text.Json
de informatie die nodig is voor serialisatie en genereert broncodebestanden die metagegevens van het JSON-contract vullen voor de aangevraagde typen.Serialisatie-optimalisatiemodus (snel pad)
JsonSerializer functies die de uitvoer van serialisatie aanpassen, zoals naamgevingsbeleid en behoud van verwijzingen, dragen een prestatieoverhead. In de serialisatie-optimalisatiemodus System.Text.Json genereert u geoptimaliseerde serialisatiecode die rechtstreeks wordt gebruikt
Utf8JsonWriter
. Deze geoptimaliseerde of snelle padcode verhoogt de serialisatiedoorvoer.Fast-path deserialisatie is momenteel niet beschikbaar. Zie dotnet/runtime-probleem 55043 voor meer informatie.
Voor het genereren van de bron is System.Text.Json
C# 9.0 of een latere versie vereist.
Vergelijking van functies
Kies reflectie- of brongeneratiemodi op basis van de volgende voordelen die elk biedt:
Voordeel | Reflectie | Brongeneratie (Modus op basis van metagegevens) |
Brongeneratie (Serialisatie-optimalisatiemodus) |
---|---|---|---|
Eenvoudiger om te coden. | ✔️ | ❌ | ❌ |
Eenvoudiger om fouten op te sporen. | ❌ | ✔️ | ✔️ |
Ondersteunt niet-openbare leden. | ✔️ | ✔️* | ✔️* |
Ondersteunt alle beschikbare serialisatieaanpassingen. | ✔️ | ❌† | ❌† |
Vermindert de opstarttijd. | ❌ | ✔️ | ✔️ |
Vermindert het gebruik van privégeheugen. | ❌ | ✔️ | ✔️ |
Elimineert runtime-reflectie. | ❌ | ✔️ | ✔️ |
Vereenvoudigt het beperken van de grootte van apps met een trimveilige app. | ❌ | ✔️ | ✔️ |
Hiermee verhoogt u de serialisatiedoorvoer. | ❌ | ❌ | ✔️ |
* De brongenerator ondersteunt sommige niet-openbare leden, bijvoorbeeld interne typen in dezelfde assembly. † door de bron gegenereerde contracten kunnen worden gewijzigd met behulp van de api voor contractaanpassing.