System.Text.Json 中的反映與來源產生
本文說明反映與來源產生之間的差異,因為其與 System.Text.Json
序列化有關。 其也提供如何為您的案例選擇最佳方法的指引。
中繼資料集合
若要序列化或還原序列化型別,JsonSerializer 需要如何存取型別成員的相關資訊。 JsonSerializer
需要下列資訊:
- 如何存取屬性 getter 和用於序列化的欄位。
- 如何存取建構函式、屬性 setter 和用於還原序列化的欄位。
- 關於哪些屬性已用來自訂序列化或還原序列化的資訊。
- 來自 JsonSerializerOptions 的執行階段設定。
這項資訊稱為「中繼資料」。
反映
JsonSerializer 預設使用 反映,在執行階段收集中繼資料。 當 JsonSerializer
第一次必須序列化或還原序列化型別時,它會收集並快取此中繼資料。 中繼資料收集流程需要一段時間並使用記憶體。
來源產生
作為替代方式,System.Text.Json
也可以使用 C# 來源產生功能來改善效能、減少私人記憶體用量,以及輔助組件調整,以降低應用程式大小。 此外,特定反映 API 不能用於原生 AOT 應用程式,因此您必須對這些應用程式使用來源產生。
來源產生可用於兩種模式:
中繼資料型模式
在編譯期間,
System.Text.Json
會收集序列化所需的資訊,並產生原始程式碼檔案,以填入所要求類型的 JSON 合約中繼資料。序列化最佳化 (快速路徑) 模式
JsonSerializer 自訂序列化輸出的功能 (例如命名原則和參考保留) 會帶來效能額外負荷。 在序列化 - 最佳化模式中,System.Text.Json 會產生直接使用
Utf8JsonWriter
的最佳化序列化程序碼。 此最佳化或「快速路徑」程式碼會增加序列化輸送量。目前無法使用快速路徑「還原串行化」。 如需詳細資訊,請參閱 dotnet/執行階段問題 55043。
System.Text.Json
的來源產生需要 C# 9.0 或更新版本。
功能比較
根據每個模式提供的下列優點,選擇反映或來源產生模式:
優點 | 反映 | 來源產生 (中繼資料型模式) |
來源產生 (序列化-最佳化模式) |
---|---|---|---|
編碼更簡單。 | ✔️ | ❌ | ❌ |
偵錯更簡單。 | ❌ | ✔️ | ✔️ |
支援非公用成員。 | ✔️ | ✔️ | ✔️ |
支援所有可用的序列化自訂。 | ✔️ | ||
減少啟動時間。 | ❌ | ✔️ | ✔️ |
減少私人記憶體使用量。 | ❌ | ✔️ | ✔️ |
消除執行階段反映。 | ❌ | ✔️ | ✔️ |
促進修剪安全的應用程式大小縮減。 | ❌ | ✔️ | ✔️ |
增加序列化輸送量。 | ❌ | ❌ | ✔️ |
* 來源產生器支援一些非公用成員,例如相同組件中的內部類型。 † 使用合約自訂 API 可以修改來源產生的合約。