Reflexion im Vergleich zur Quellgenerierung in System.Text.Json

In diesem Artikel werden die Unterschiede zwischen der Reflexion und der Quellgenerierung im Zusammenhang mit der System.Text.Json-Serialisierung erläutert. Außerdem enthält er Anleitungen zum Auswählen des besten Ansatzes für Ihr Szenario.

Metadatensammlung

Zum Serialisieren oder Deserialisieren eines Typs benötigt JsonSerializer Informationen zur Vorgehensweise beim Zugriff auf die Member des Typs. JsonSerializer benötigt folgende Informationen:

  • Vorgehensweise beim Zugriff auf Eigenschaftengetter und Felder für die Serialisierung.
  • Vorgehensweise beim Zugriff auf einen Konstruktor, Eigenschaftensetter und Felder für die Deserialisierung.
  • Informationen darüber, welche Attribute zum Anpassen der Serialisierung oder Deserialisierung verwendet wurden.
  • Laufzeitkonfiguration von JsonSerializerOptions.

Diese Informationen werden als Metadaten bezeichnet.

Spiegelung

Standardmäßig sammelt JsonSerializer Metadaten zur Laufzeit mithilfe der Reflexion. Wenn JsonSerializer zum ersten Mal einen Typen serialisieren oder deserialisieren muss, werden diese Metadaten erfasst und zwischengespeichert. Der Prozess der Metadatensammlung nimmt Zeit und Arbeitsspeicher in Anspruch.

Quellengenerierung

Alternativ kann System.Text.Json das C#-Feature zur Quellgenerierung verwenden, um die Leistung zu verbessern, die Nutzung des privaten Arbeitsspeichers zu reduzieren und das Kürzen von Assemblys zu erleichtern, wodurch die App-Größe reduziert wird. Darüber hinaus können bestimmte Reflexions-APIs nicht in nativen AOT-Anwendungen verwendet werden, daher müssen Sie die Quellgenerierung für diese Apps verwenden.

Es stehen ihnen zwei Quellgenerierungmodi zur Vefügung:

  • Metadatenbasierter Modus

    Während der Kompilierung sammelt System.Text.Json die für die Serialisierung erforderlichen Informationen und generiert Quellcodedateien, die JSON-Vertragsmetadaten für die angeforderten Typen auffüllen.

  • Serialisierungsoptimierungsmodus (schneller Pfad)

    JsonSerializer-Funktionen, die die Ausgabe der Serialisierung anpassen, z. B. Benennungsrichtlinien und Referenzerhaltung, verursachen einen Leistungsaufwand. Im Serialisierungsoptimierungsmodus generiert System.Text.Json optimierten Serialisierungscode, der direkt Utf8JsonWriter verwendet. Dieser optimierte oder schnelle Pfad-Code erhöht den Serialisierungsdurchsatz.

    Die Deserialisierung mit schnellem Pfad ist derzeit nicht verfügbar. Weitere Informationen finden Sie unter dotnet/runtime issue 55043.

Die Quellgenerierung für System.Text.Json benötigt C# 9.0 oder höher.

Funktionsvergleiche

Wählen Sie Reflexions- oder Quellgenerierungsmodi auf Basis der folgenden jeweiligen Vorteile aus:

Vorteil Spiegelung Quellengenerierung
(Metadatenbasierter Modus)
Quellengenerierung
(Serialisierungsoptimierungsmodus)
Einfacher zu codieren. ✔️
Einfacher zu debuggen. ✔️ ✔️
Unterstützt nicht öffentliche Member. ✔️ ✔️* ✔️*
Unterstützt alle verfügbaren Serialisierungsanpassungen. ✔️
Reduziert die Startzeit. ✔️ ✔️
Reduziert die Auslastung des privaten Arbeitsspeichers. ✔️ ✔️
Eliminiert die Laufzeitreflexion. ✔️ ✔️
Erleichtert die sichere Reduzierung der App-Größe. ✔️ ✔️
Erhöht den Serialisierungsdurchsatz. ✔️

* Der Quellgenerator unterstützt einige nicht öffentliche Member, z. B. interne Typen in derselben Assembly. † Quellgenerierte Verträge können mithilfe der Vertragsanpassungs-API geändert werden.

Vorteil Spiegelung Quellengenerierung
(Metadatenbasierter Modus)
Quellengenerierung
(Serialisierungsoptimierungsmodus)
Einfacher zu codieren. ✔️
Einfacher zu debuggen. ✔️
Unterstützt nicht öffentliche Accessoren. ✔️
Unterstützt erforderliche Eigenschaften. ✔️
Unterstützt Init-Only-Eigenschaften. ✔️
Reduziert die Startzeit. ✔️ ✔️
Reduziert die Auslastung des privaten Arbeitsspeichers. ✔️ ✔️
Eliminiert die Laufzeitreflexion. ✔️ ✔️
Erleichtert die sichere Reduzierung der App-Größe. ✔️ ✔️
Erhöht den Serialisierungsdurchsatz. ✔️