共用方式為


在 System.Text.Json 中的反射與源代碼生成

本文說明反映與來源產生之間的差異,因為它與 System.Text.Json 串行化有關。 它也提供如何為您的案例選擇最佳方法的指引。

元數據集合

若要序列化或還原序列化類型,JsonSerializer 需要有關如何存取型別成員的資訊。 JsonSerializer 需要下列資訊:

  • 如何存取屬性取值器和欄位以進行序列化。
  • 如何存取反序列化的建構函式、屬性設定器和欄位。
  • 有關用來自定義序列化或反序列化的屬性的信息。
  • 執行時配置來自 JsonSerializerOptions

這項資訊稱為 元數據

反射

預設情況下,透過 JsonSerializer反射在執行時收集元資料。 每當 JsonSerializer 第一次必須序列化或反序列化某類型時,它會收集並快取此元數據。 元數據收集程式需要時間並使用記憶體。

源代碼生成

作為替代方式,System.Text.Json 也可以使用 C# 來源產生功能來改善效能、減少私人記憶體用量,以及輔助組件調整,以降低應用程式大小。 此外,某些反映 API 無法在 原生 AOT 應用程式中使用,因此您必須針對這些應用程式使用來源產生。

來源產生可用於兩種模式:

  • 元數據型模式

    在編譯期間,收集串行化所需的資訊, System.Text.Json 併產生原始碼檔案,以填入所要求類型的 JSON 合約元數據。

  • 串行化優化 (快速路徑) 模式

    JsonSerializer 自定義串行化輸出的功能,例如命名原則和參考保留,會產生效能額外負荷。 在串行化優化模式中,System.Text.Json 產生優化的串行化代碼,直接使用 Utf8JsonWriter。 此優化或 快速路徑程式 程式碼會增加序列化吞吐量。

    目前無法使用快速路徑 反序列化 。 如需詳細資訊,請參閱 dotnet/runtime 問題 55043

System.Text.Json 的來源產生需要 C# 9.0 或更新版本。

功能比較

根據每個模式所提供的下列優點,選擇反映或來源產生模式:

優點 反射 源代碼生成
(元數據型模式)
源代碼生成
(串行化優化模式)
程式代碼更簡單。 ✔️
偵錯更簡單。 ✔️ ✔️
支援非公有成員。 ✔️ ✔️* ✔️*
支援所有可用的串行化自定義。 ✔️
減少啟動時間。 ✔️ ✔️
減少私人記憶體使用量。 ✔️ ✔️
消除了運行時反射。 ✔️ ✔️
促使安全修剪應用程式大小的縮減。 ✔️ ✔️
增加串行化輸送量。 ✔️

* 來源產生器支援 一些 非公用成員,例如相同元件中的內部類型。 †來源產生的合約可以使用合約自定義 API 來修改。