謹慎
我們強烈建議不要使用 BinaryFormatter ,因為 有相關聯的安全性風險。 現有的用戶應該遷移開來。BinaryFormatter
從 .NET 9 開始,我們不再在運行時中包含 BinaryFormatter 的實作。 API 仍然存在,但其實作一律會擲回 PlatformNotSupportedException,而不論專案類型為何。 因此,設定現有的回溯相容性旗標已不足以使用 BinaryFormatter。
您有兩個選項可以解決這個問題:
遷移BinaryFormatter。 強烈建議您調查因相關BinaryFormatter而停止使用的選項。 我們在下面列出 數個選項 。
繼續使用 BinaryFormatter。 如果您需要在 .NET 9 中繼續使用 BinaryFormatter ,則必須依賴 不支援的 System.Runtime.Serialization.Formatters NuGet 套件,以取代會引發錯誤的實作版本。
使用 BinaryFormatter的風險為何?
任何允許其輸入攜帶有關要建立物件信息的反序列化器,不論是文字或二進位,都可能是潛在的安全問題。 有一個常見的弱點枚舉(CWE)描述此問題:CWE-502「反序列化未受信任的資料」。 BinaryFormatter,是包含在 2002 年 .NET Framework 初始版本中的反序列化程式庫。 我們也在 BinaryFormater 安全性指南中說明這一點。
由於使用 BinaryFormatter的已知風險,此功能已從 .NET Core 1.0 中排除。 但是,由於缺乏明確的移轉路徑來使用更安全的方案,客戶的需求促使 BinaryFormatter 被納入 .NET Core 2.0 中。 自那時起,.NET 團隊一直致力於移除 BinaryFormatter,並在多種項目類型中默認關閉它,但如果仍需要向後相容,則允許使用者透過選項手動開啟。
如需有關該決定的詳細資訊,請參閱 BinaryFormatter .NET 9 的公告中關於其將被移除的內容。
如果您遇到此移轉指南中未解決的移除相關問題 BinaryFormatter,請在 github.com/dotnet/runtime 提出問題,並指出問題與移除 BinaryFormatter有關。
移轉主題
移轉 BinaryFormatter 通常表示 選擇不同的序列化器。 不過,如果您同時控制編碼數據的產生者和取用者,通常才可行。 如果您不控制產生者,您也可以移至我們的 新 API 來讀取 BinaryFormatter 承載 ,而不需具現化任何編碼類型。
以下會探索這兩個選項。
選擇序列化程式
從移轉 BinaryFormatter 的第一個步驟是選擇要在其位置使用的 串行化程式 。 根據您的特定需求,.NET 小組建議移轉至四個不同的串行化程式。
- 遷移至 System.Text.Json (JSON)
- 遷移至 DataContractSerializer (XML)
- 遷移至 MessagePack (二進制)
- 遷移至 protobuf-net (binary)
讀取 BinaryFormatter (NRBF) 負載
許多應用程式會載入並還原序列化已保存至儲存的承載,而不一定能夠預先轉換所有已保存的承載。 其他案例可能牽涉到接收 所 BinaryFormatter產生數據的系統或服務,這些系統必須獨立移轉。
在這些案例和其他情況中,有必要保留讀取所提供有效負載的功能,並隨著時間轉移至新的格式。 為了符合這些需求,現在可以安全地讀取,而不需要執行一般用途且易受攻擊的反序列化。
移轉 Windows Forms 和 WPF 應用程式
Windows Forms 和 WPF 應用程式可能需要其他變更。 如需進一步的移轉指引,請參閱 Windows Forms 應用程式、 WPF 應用程式和WinForms/WPF 剪貼簿和拖放指引 。
移轉受控資源 (ResX)
最常見的資源類型(例如字串和圖示)將在沒有 的情況下 BinaryFormatter運作。 針對自定義類型,您需要引進 BinaryFormatter 並啟用相容性參數,請參閱 在運行時間期間載入資源。
使用相容性套件
在升級至 .NET 9 時,如果無法完成從 BinaryFormatter 轉移,可以使用不受支援的相容性套件。 System.Runtime.SerializationFormatters NuGet 套件包含BinaryFormatter的功能實作,包括其弱點和風險。
雖然不支援且不建議使用相容性套件,但指南包含安裝套件並啟用功能的詳細數據。
謹慎
我們強烈建議不要使用 BinaryFormatter ,因為 有相關聯的安全性風險。 現有的用戶應該遷移開來。BinaryFormatter