Share via


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.

Voordeel Reflectie Brongeneratie
(Modus op basis van metagegevens)
Brongeneratie
(Serialisatie-optimalisatiemodus)
Eenvoudiger om te coden. ✔️
Eenvoudiger om fouten op te sporen. ✔️
Ondersteunt niet-openbare toegangsrechten. ✔️
Ondersteunt vereiste eigenschappen. ✔️
Ondersteunt alleen-init-eigenschappen. ✔️
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. ✔️