Megosztás a következőn keresztül:


Forrásgenerálási módok a következőben: System.Text.Json

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 .

Lásd még