Sdílet prostřednictvím


Reflexe versus generování zdroje vSystem.Text.Json

Tento článek vysvětluje rozdíly mezi reflexí a generováním zdroje, protože souvisí se System.Text.Json serializací. Obsahuje také pokyny k volbě nejlepšího přístupu pro váš scénář.

Kolekce metadat

Chcete-li serializovat nebo deserializovat typ, potřebuje informace o tom, JsonSerializer jak získat přístup k členům typu. JsonSerializer potřebuje následující informace:

  • Přístup k getterům a polím vlastnosti pro serializaci
  • Přístup ke konstruktoru, setter vlastností a polím pro deserializaci
  • Informace o tom, které atributy byly použity k přizpůsobení serializace nebo deserializace.
  • Konfigurace za běhu z JsonSerializerOptions.

Tyto informace se označují jako metadata.

Reflexe

Ve výchozím nastavení JsonSerializer shromažďuje metadata za běhu pomocí reflexe. Kdykoli JsonSerializer musí serializovat nebo deserializovat typ poprvé, shromažďuje a ukládá tato metadata do mezipaměti. Proces shromažďování metadat nějakou dobu trvá a využívá paměť.

Generování zdroje

Jako alternativu System.Text.Json můžete pomocí funkce generování zdroje C# zlepšit výkon, snížit využití privátní paměti a usnadnit oříznutí sestavení, což snižuje velikost aplikace. Kromě toho se určitá rozhraní API reflexe nedají použít v nativních aplikacích AOT, takže pro tyto aplikace musíte použít generování zdroje.

Generování zdroje se dá použít ve dvou režimech:

  • Režim založený na metadatech

    Během kompilace System.Text.Json shromažďuje informace potřebné pro serializaci a generuje soubory zdrojového kódu, které naplní metadata kontraktu JSON pro požadované typy.

  • Režim optimalizace serializace (rychlá cesta)

    JsonSerializer funkce, které přizpůsobují výstup serializace, jako jsou zásady pojmenování a zachování odkazů, mají režii na výkon. V režimu serializace optimalizace generuje optimalizovaný serializační kód, System.Text.Json který používá Utf8JsonWriter přímo. Tento optimalizovaný nebo rychlý kód cesty zvyšuje propustnost serializace.

    Deserializace fast-path není v současné době dostupná. Další informace najdete v tématu dotnet/runtime problém 55043.

Generování zdroje pro System.Text.Json vyžaduje C# 9.0 nebo novější verzi.

Porovnání funkcí

Zvolte režimy reflexe nebo generování zdroje na základě následujících výhod, které každá nabízí:

Výhoda Reflexe Generování zdroje
(Režim založený na metadatech)
Generování zdroje
(Režim optimalizace serializace)
Jednodušší kód. ✔️
Jednodušší ladění. ✔️ ✔️
Podporuje neveřejné členy. ✔️ ✔️* ✔️*
Podporuje všechna dostupná přizpůsobení serializace. ✔️
Zkracuje dobu spuštění. ✔️ ✔️
Snižuje využití privátní paměti. ✔️ ✔️
Eliminuje odraz za běhu. ✔️ ✔️
Usnadňuje zmenšení velikosti aplikací bezpečných pro oříznutí. ✔️ ✔️
Zvyšuje propustnost serializace. ✔️

* Zdrojový generátor podporuje některé neveřejné členy, například interní typy ve stejném sestavení. † zdrojové kontrakty je možné upravit pomocí rozhraní API pro přizpůsobení kontraktu.

Výhoda Reflexe Generování zdroje
(Režim založený na metadatech)
Generování zdroje
(Režim optimalizace serializace)
Jednodušší kód. ✔️
Jednodušší ladění. ✔️
Podporuje neveřejné přístupové objekty. ✔️
Podporuje požadované vlastnosti. ✔️
Podporuje pouze inicializační vlastnosti. ✔️
Zkracuje dobu spuštění. ✔️ ✔️
Snižuje využití privátní paměti. ✔️ ✔️
Eliminuje odraz za běhu. ✔️ ✔️
Usnadňuje zmenšení velikosti aplikací bezpečných pro oříznutí. ✔️ ✔️
Zvyšuje propustnost serializace. ✔️