Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Quellgenerierung kann in zwei Modi verwendet werden: Metadatenbasierte und Serialisierungsoptimierung. In diesem Artikel werden die verschiedenen Modi beschrieben.
Informationen zur Verwendung von Quellgenerierungsmodi finden Sie unter Verwenden der Quellgenerierung in System.Text.Json.
Metadatenbasierter Modus
Sie können die Quellgenerierung verwenden, um den Metadatensammlungsprozess von Laufzeit zu Kompilierungszeit zu verschieben. Während der Kompilierung werden die Metadaten gesammelt und Quellcodedateien generiert. Die generierten Quellcodedateien werden automatisch als integraler Bestandteil der Anwendung kompiliert. Diese Technik beseitigt die Laufzeitmetadatensammlung, wodurch die Leistung sowohl der Serialisierung als auch der Deserialisierung verbessert wird.
Die aus der Quellgenerierung resultierenden Leistungsverbesserungen können erheblich sein. Die Testergebnisse haben beispielsweise eine Reduzierung der Startzeit um bis zu 40 % oder mehr, eine Verringerung des privaten Arbeitsspeichers, eine Erhöhung der Durchsatzgeschwindigkeit (im Serialisierungsoptimierungsmodus) und eine Verringerung der App-Größe gezeigt.
Bekannte Probleme
Nur public Eigenschaften und Felder werden standardmäßig im Serialisierungsmodus (Spiegelung oder Quellgenerierung) unterstützt. Der Spiegelungsmodus unterstützt jedoch die Verwendung von private Mitgliedern, während der Quellgenerierungsmodus dies nicht tut. Beispielsweise können Sie das JsonInclude-Attribut auf eine Eigenschaft oder eine Eigenschaft anwenden, die über einen private-Setter oder private-Getter verfügt, und sie wird im Reflexionsmodus serialisiert. Der Quellgenerierungsmodus unterstützt nur public- oder internal-Mitglieder und public- oder internal-Accessoren von public-Eigenschaften. Wenn Sie [JsonInclude] auf private-Mitglieder oder -Accessoren festlegen und den Quellgenerierungsmodus auswählen, wird zur Laufzeit ein NotSupportedException ausgelöst.
Informationen zu anderen bekannten Problemen bei der Quellgenerierung finden Sie unter GitHub-Problemen mit dem Etikett „source-generator“ im dotnet/runtime-Repository.
Serialisierungsoptimierungsmodus (schneller Pfad)
JsonSerializer verfügt über viele Features, die die Ausgabe der Serialisierung anpassen, z. B. Schreibweise für alle Eigenschaftsnamen und Beibehalten von Verweisen. Die Unterstützung all dieser Features verursacht einen gewissen Leistungsaufwand. Die Quellgenerierung kann die Serialisierungsleistung verbessern, indem optimierter Code generiert wird, der Utf8JsonWriter direkt verwendet.
Der Serialisierungsoptimierungsmodus gibt methoden für die Serialisierung schneller Pfade aus, aber keine Serialisierungsmetadaten. Die Fast-Path-Serialisierung ist in ihrer Funktionsweise eingeschränkt; sie unterstützt keine asynchrone Serialisierung oder irgendeinen Modus der Deserialisierung.
Darüber hinaus unterstützt der optimierte Code nicht alle Serialisierungsfunktionen, die JsonSerializer unterstützt. Das Serialisierungsmodul erkennt, ob der optimierte Code verwendet werden kann, und greift auf den Standardserialisierungscode zurück, wenn nicht unterstützte Optionen angegeben werden. Beispielsweise ist JsonNumberHandling.AllowReadingFromString nicht auf das Schreiben anwendbar, sodass die Angabe dieser Option nicht zu einem Rückgriff auf den Standardcode führt.
Die folgende Tabelle zeigt, welche Optionen in JsonSerializerOptions von der Serialisierung mit schnellem Pfad unterstützt werden:
| Serialisierungsoption | Unterstützt für schnelle Pfade |
|---|---|
| AllowTrailingCommas | ✔️ |
| Converters | ❌ |
| DefaultBufferSize | ✔️ |
| DefaultIgnoreCondition | ✔️ |
| DictionaryKeyPolicy | ❌ |
| Encoder | ❌ |
| IgnoreNullValues | ❌ |
| IgnoreReadOnlyFields | ✔️ |
| IgnoreReadOnlyProperties | ✔️ |
| IncludeFields | ✔️ |
| MaxDepth | ✔️ |
| NumberHandling | ❌ |
| PropertyNamingPolicy | ✔️ |
| ReferenceHandler | ❌ |
| TypeInfoResolver | ✔️ |
| WriteIndented | ✔️ |
(Die folgenden Optionen werden nicht unterstützt, da sie nur für die Deserialisierung gelten: PropertyNameCaseInsensitive, ReadCommentHandlingund UnknownTypeHandling.)
Die folgende Tabelle zeigt, welche Attribute durch die Serialisierung mit schnellem Pfad unterstützt werden:
| attribute | Unterstützt für schnelle Pfade |
|---|---|
| JsonConstructorAttribute | ❌ |
| JsonConverterAttribute | ❌ |
| JsonDerivedTypeAttribute | ✔️ |
| JsonExtensionDataAttribute | ❌ |
| JsonIgnoreAttribute | ✔️ |
| JsonIncludeAttribute | ✔️ |
| JsonNumberHandlingAttribute | ❌ |
| JsonPolymorphicAttribute | ✔️ |
| JsonPropertyNameAttribute | ✔️ |
| JsonPropertyOrderAttribute | ✔️ |
| JsonRequiredAttribute | ✔️ |
Wenn eine nicht unterstützte Option oder ein Attribut für einen Typ angegeben wird, greift der Serializer auf den Metadatenmodus zurück, vorausgesetzt, der Quellgenerator wurde zum Generieren von Metadaten konfiguriert. In diesem Fall wird der optimierte Code beim Serialisieren dieses Typs nicht verwendet, kann jedoch für andere Typen verwendet werden. Daher ist es wichtig, Leistungstests mit Ihren Optionen und Workloads durchzuführen, um zu ermitteln, wie viel Nutzen Sie tatsächlich aus dem Serialisierungsoptimierungsmodus ziehen können. Außerdem erfordert die Möglichkeit, auf JsonSerializer Code zurückzugreifen, den Metadatenmodus. Wenn Sie nur den Serialisierungsoptimierungsmodus auswählen, tritt bei der Serialisierung möglicherweise für Typen oder Optionen, die auf JsonSerializer-Code zurückgreifen müssen, ein Fehler auf.