ソース生成は、 メタデータベース と シリアル化の最適化の 2 つのモードで使用できます。 この記事では、さまざまなモードについて説明します。
ソース生成モードの使用方法については、「System.Text.Json でソース生成を使用する方法」を参照してください。
メタデータベースのモード
ソース生成を使用して、メタデータ コレクション プロセスを実行時からコンパイル時に移動できます。 コンパイル中に、メタデータが収集され、ソース コード ファイルが生成されます。 生成されたソース コード ファイルは、アプリケーションの不可欠な部分として自動的にコンパイルされます。 この手法では、実行時のメタデータ コレクションが不要になるため、シリアル化と逆シリアル化の両方のパフォーマンスが改善されます。
ソース生成によってパフォーマンスが大幅に改善する可能性があります。 たとえば、テスト結果には、最大で 40% 以上の起動時間の短縮、プライベート メモリの削減、スループット速度の増加 (シリアル化の最適化モードで)、アプリ サイズの縮小が示されています。
既知の問題
既定では、 public
プロパティとフィールドのみがシリアル化モード (リフレクションまたはソース生成) でサポートされます。 ただし、リフレクション モードでは private
メンバーの使用がサポートされますが、ソース生成モードではサポートされません。 たとえば、 JsonInclude 属性 を private
プロパティまたは private
セッターまたはゲッターを持つプロパティに適用すると、リフレクション モードでシリアル化されます。 ソース生成モードでは、 public
または internal
メンバーと、 public
プロパティの internal
アクセサーまたは public
アクセサーのみがサポートされます。
[JsonInclude]
メンバーまたはアクセサーに private
を設定し、ソース生成モードを選択すると、実行時に NotSupportedException
がスローされます。
ソース生成に関するその他の既知の問題の詳細については、dotnet/runtime リポジトリで "source-generator" というラベルが付いている GitHub イシューに関する記事を参照してください。
シリアル化最適化 (高速パス) モード
JsonSerializer
には、 名前付けポリシーの や 参照の保持など、シリアル化の出力をカスタマイズ多くの機能があります。 これらすべての機能をサポートすると、パフォーマンスのオーバーヘッドが発生します。 ソース生成によって Utf8JsonWriter
を直接使用する最適化されたコードが生成されることにより、シリアル化のパフォーマンスが向上します。
シリアル化最適化モードでは、高速パスのシリアル化メソッドが出力されますが、シリアル化メタデータは出力されません。 高速パスのシリアル化は、実行できる操作で制限されます。非同期シリアル化または逆シリアル化モードはサポートされていません。
さらに、最適化されたコードでは、 JsonSerializer
がサポートするすべてのシリアル化機能をサポートしているわけではありません。 シリアライザーでは、最適化されたコードを使用できるかどうかが検出され、サポートされていないオプションが指定されている場合は既定のシリアル化コードにフォールバックします。 たとえば、JsonNumberHandling.AllowReadingFromString は書き込みには適用されません。したがって、このオプションを指定しても、既定のコードにフォールバックすることはありません。
次の表に、高速パス シリアル化により JsonSerializerOptions
のどのオプションがサポートされているのかを示します。
シリアル化のオプション | 高速パスでサポートされます |
---|---|
AllowTrailingCommas | ✔️ |
Converters | ❌ |
DefaultBufferSize | ✔️ |
DefaultIgnoreCondition | ✔️ |
DictionaryKeyPolicy | ❌ |
Encoder | ❌ |
IgnoreNullValues | ❌ |
IgnoreReadOnlyFields | ✔️ |
IgnoreReadOnlyProperties | ✔️ |
IncludeFields | ✔️ |
MaxDepth | ✔️ |
NumberHandling | ❌ |
PropertyNamingPolicy | ✔️ |
ReferenceHandler | ❌ |
TypeInfoResolver | ✔️ |
WriteIndented | ✔️ |
(次のオプションは、"逆" シリアル化にのみ適用されるため、サポートされていません: 、PropertyNameCaseInsensitive、ReadCommentHandling)。UnknownTypeHandling
次の表に、高速パス シリアル化でどの属性がサポートされているかを示します。
サポートされていないオプションまたは属性が型に対して指定されている場合、ソース ジェネレーターがメタデータを生成するように構成されていると仮定すると、シリアライザーは メタデータ モードにフォールバックします。 その場合、最適化されたコードはその型をシリアル化するときに使用されませんが、他の型に使用される可能性があります。 したがって、オプションとワークロードを使用してパフォーマンス テストを実行し、実際にシリアル化最適化モードから得られるベネフィットを判断することが重要です。 また、 JsonSerializer
コードにフォールバックする機能には 、メタデータ モードが必要です。 シリアル化最適化モードのみを選択した場合、JsonSerializer
コードへのフォールバックを必要とする型またはオプションについてはシリアル化が失敗する場合があります。
関連項目
.NET