Delen 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:

  • Hoe toegang te krijgen tot eigenschappen, 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 genereert System.Text.Json geoptimaliseerde serialisatiecode die Utf8JsonWriter rechtstreeks gebruikt. 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. ✔️ ✔️
Verwijdert reflectie tijdens uitvoering. ✔️ ✔️
Vereenvoudigt het veilig reduceren van de grootte van apps. ✔️ ✔️
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.