來源產生可用於兩種模式: 元數據型 和 串行化優化。 本文說明不同的模式。
如需如何使用來源產生模式的資訊,請參閱如何在 System.Text.Json 中使用來源產生 (機器翻譯)。
中繼資料型模式
您可以使用來源產生,將中繼資料收集流程從執行階段移至編譯時期。 在編譯期間,會收集中繼資料,並產生原始程式碼檔案。 產生的原始程式碼檔案會自動編譯為應用程式不可或缺的一部分。 這項技術會消除執行階段中繼資料集合,這可改善序列化和還原序列化的效能。
來源產生所提供的效能改善可能相當重要。 例如,測試結果已顯示減少高達 40% 或以上的啟動時間、減少私人記憶體、增加輸送量速度 (在序列化最佳化模式下),以及縮減應用程式大小。
已知問題
預設情況下,public
屬性和欄位在串行化模式中(反射或源生成)均受支援。 不過,反映模式支援使用 private
成員,而來源產生模式則不支援。 例如,如果您將 JsonInclude 屬性套用至 private
屬性或具有 private
setter 或 getter 的屬性,該屬性會以反映模式序列化。 來源產生模式僅支援 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
程式碼的型別或選項而失敗。