Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A forráslétrehozás két módban használható: metaadatokon alapuló és szerializálási optimalizálás. Ez a cikk a különböző módokat ismerteti.
A forrásgenerálási módok használatáról a Forrásgenerálás használata a következő témakörben olvashat bővebben System.Text.Json.
Metaadat-alapú mód
A forrásgenerálás használatával áthelyezheti a metaadat-gyűjtési folyamatot a futtatókörnyezetből a fordítási időbe. A fordítás során a rendszer összegyűjti a metaadatokat, és létrehozza a forráskódfájlokat. A létrehozott forráskódfájlok automatikusan az alkalmazás szerves részeként lesznek lefordítva. Ez a technika kiküszöböli a futásidejű metaadatok gyűjteményét, ami javítja a szerializálás és a deszerializálás teljesítményét.
A forrásgeneráció által biztosított teljesítménybeli fejlesztések jelentősek lehetnek. A teszteredmények például akár 40%-os vagy nagyobb indítási időcsökkenést, magánmemóriát, átviteli sebesség növelését (szerializálás optimalizálási módban) és alkalmazásméret-csökkentést mutattak.
Ismert problémák
Szerializálási módban (tükröződés vagy forrásgenerálás) alapértelmezés szerint csak public tulajdonságok és mezők támogatottak. A tükröződési mód azonban támogatja a private tagok használatát, míg a forrásgenerálási mód nem. Ha például a JsonInclude attribútumot egy private olyan tulajdonságra vagy tulajdonságra alkalmazza, amely beállítóval vagy getterrel rendelkezik private , az tükröződési módban lesz szerializálva. A forrásgenerációs mód csak vagy csak public a tulajdonságok tagjait és internalpublic tartozékait támogatjainternal.public Ha beállítja [JsonInclude] a private tagok vagy hozzáférési elemek esetében, és a forráskód-generálási módot választja, futásidőben egy NotSupportedException fog keletkezni.
A forráslétrehozással kapcsolatos egyéb ismert problémákról a "forrásgenerátor" címkével ellátott GitHub-problémák a dotnet/runtime adattárban találhatók.
Szerializálás-optimalizálás (gyorsútvonal) mód
JsonSerializer számos olyan funkcióval rendelkezik, amelyek testre szabják a szerializálás kimenetét, például az elnevezési szabályzatokat és a hivatkozások megőrzését. Az összes funkció támogatása némi teljesítményterhelést okoz. A forráslétrehozás a közvetlenül használt Utf8JsonWriter optimalizált kód létrehozásával javíthatja a szerializáció teljesítményét.
A szerializációoptimalizálási mód gyorsított szerializálási módszereket bocsát ki, a szerializálási metaadatokat nem. A gyorsútvonal-szerializálás a műveletekben korlátozott; nem támogatja az aszinkron szerializálást vagy a deszerializálás semmilyen módját.
Emellett az optimalizált kód nem támogatja az összes támogatott szerializálási funkciót JsonSerializer . A szerializáló észleli, hogy az optimalizált kód használható-e, és visszaesik-e az alapértelmezett szerializálási kódra, ha nem támogatott beállítások vannak megadva. Például JsonNumberHandling.AllowReadingFromString írásra nem alkalmazható, ezért a beállítás megadása nem okoz tartalékot az alapértelmezett kódra.
Az alábbi táblázat azt mutatja be, hogy mely beállításokat JsonSerializerOptions támogatja a gyorsútvonal-szerializálás:
| Szerializálási beállítás | Gyorsútvonal esetén támogatott |
|---|---|
| AllowTrailingCommas | ✔️ |
| Converters | ❌ |
| DefaultBufferSize | ✔️ |
| DefaultIgnoreCondition | ✔️ |
| DictionaryKeyPolicy | ❌ |
| Encoder | ❌ |
| IgnoreNullValues | ❌ |
| IgnoreReadOnlyFields | ✔️ |
| IgnoreReadOnlyProperties | ✔️ |
| IncludeFields | ✔️ |
| MaxDepth | ✔️ |
| NumberHandling | ❌ |
| PropertyNamingPolicy | ✔️ |
| ReferenceHandler | ❌ |
| TypeInfoResolver | ✔️ |
| WriteIndented | ✔️ |
(A következő beállítások nem támogatottak, mert csak a szerializálás megszüntetésére vonatkoznak: PropertyNameCaseInsensitive, ReadCommentHandlingés UnknownTypeHandling.)
Az alábbi táblázat azt mutatja be, hogy mely attribútumokat támogatja a gyorsútvonal-szerializálás:
| Attribútum | Gyorsútvonal esetén támogatott |
|---|---|
| JsonConstructorAttribute | ❌ |
| JsonConverterAttribute | ❌ |
| JsonDerivedTypeAttribute | ✔️ |
| JsonExtensionDataAttribute | ❌ |
| JsonIgnoreAttribute | ✔️ |
| JsonIncludeAttribute | ✔️ |
| JsonNumberHandlingAttribute | ❌ |
| JsonPolymorphicAttribute | ✔️ |
| JsonPropertyNameAttribute | ✔️ |
| JsonPropertyOrderAttribute | ✔️ |
| JsonRequiredAttribute | ✔️ |
Ha egy típushoz nem támogatott beállítás vagy attribútum van megadva, a szerializáló visszaáll a metaadat-módra, feltéve, hogy a forrásgenerátor metaadatok létrehozására lett konfigurálva. Ebben az esetben az optimalizált kód nem használatos a típus szerializálásakor, de más típusok esetében is használható. Ezért fontos, hogy a lehetőségek és a számítási feladatok segítségével végezze el a teljesítménytesztelést, hogy megállapítsa, mennyi előnyhöz juthat ténylegesen a szerializálás-optimalizálási módból. Emellett a kódra való visszalépéshez JsonSerializermetaadat-mód szükséges. Ha csak szerializálás-optimalizálási módot választ, a szerializálás meghiúsulhat olyan típusok vagy beállítások esetében, amelyeknek vissza kell esnie a kódba JsonSerializer .