Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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:
- Jak přistupovat k getterům a polím vlastností pro sérializaci.
- Jak přistupovat ke konstruktoru, nastavovačům vlastností a polím pro deserializaci.
- Informace o tom, které atributy byly použity k přizpůsobení serializace nebo deserializace.
- Konfigurace modulu runtime z JsonSerializerOptions.
Tyto informace se označují jako metadata.
Úvaha
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 může System.Text.Json využít funkci generování kódu v C# ke zlepšení výkonu, snížení využití privátní paměti a usnadnění optimalizace sestav, 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.Jsonshromažď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í dopad na výkon. V režimu optimalizace serializace System.Text.Json generuje optimalizovaný serializační kód, který používá
Utf8JsonWriterpřímo. Tento optimalizovaný nebo rychlý kód cesty zvyšuje propustnost serializace.Deserializace fast-path není v současné době dostupná. Další informace viz dotnet/runtime issue 55043.
Generování zdroje pro System.Text.Json vyžaduje C# 9.0 nebo novější verzi.
Note
Podpora diskriminovaných unií v jazyce F# funguje pouze v režimu reflexe. Vyžaduje dynamický kód a metadata reflexe, která se neopakují. Nemůžete ho použít s generováním zdrojového kódu ani nativními funkcemi AOT. Další informace naleznete v článku F# diskriminované unie.
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 | Úvaha | Generování zdroje (Režim založený na metadatech) |
Generování zdroje (Režim optimalizace serializace) |
|---|---|---|---|
| Jednodušší kód. | ✔️ | ❌ | ❌ |
| Jednodušší ladění. | ❌ | ✔️ | ✔️ |
Podporuje [JsonInclude] u neveřejných členů. |
✔️ | ✔️* | ✔️* |
| Podporuje všechna dostupná přizpůsobení serializace. | ✔️ | ❌ † | ❌ † |
| Zkracuje dobu spuštění. | ❌ | ✔️ | ✔️ |
| Snižuje využití privátní paměti. | ❌ | ✔️ | ✔️ |
| Eliminuje odraz modulu runtime. | ❌ | ✔️ | ✔️ |
| Usnadňuje zmenšení velikosti aplikací bez narušení jejich funkčnosti. | ❌ | ✔️ | ✔️ |
| Zvyšuje propustnost serializace. | ❌ | ❌ | ✔️ |
* Od verze .NET 11 podporuje generování zdrojového kódu členy private, internal a protected, které explicitně označíte atributem [JsonInclude]. Podporuje také private, internala protected přístupové objekty u vlastností, které označíte znakem [JsonInclude]. Generování zdroje založené na metadatech podporuje nepřístupné konstruktory, které označíte pomocí [JsonConstructor]. Vygenerované settery se spustí pouze pro vlastnosti pouze pro init, které se v JSONu vyskytují, takže vynechané vlastnosti si ponechají hodnoty inicializátoru. V .NET 10 a starších verzích generování zdrojového kódu nepodporuje členy ani přístupory private nebo protected ani nepřístupné konstruktory. Vygenerovaný kontext může přistupovat k členům a přístupovým metodám internal pouze tehdy, když jsou součástí stejného sestavení. Další informace naleznete v tématu Neveřejné členy a konstruktory.
† K úpravě zdrojových kontraktů můžete použít rozhraní API pro přizpůsobení kontraktu.