Reflexe versus generování zdroje v System.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.