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.
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 erfasst JsonSerializer zur Laufzeit Metadaten mithilfe von Reflection. 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.Jsondie 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
Utf8JsonWriterverwendet. Dieser optimierte oder Schnellpfad-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. | ❌ | ✔️ | ✔️ |
| Entfernt laufzeitreflektion. | ❌ | ✔️ | ✔️ |
| Erleichtert die sichere Reduzierung der App-Größe. | ❌ | ✔️ | ✔️ |
| Erhöht den Serialisierungsdurchsatz. | ❌ | ❌ | ✔️ |
Der Quellgenerator unterstützt einige nicht öffentliche Mitglieder, z. B. interne Typen in derselben Assembly. † Quellgenerierte Verträge können mithilfe der Vertragsanpassungs-API geändert werden.