Windows Forms 的 BinaryFormatter 移轉指南
BinaryFormatter 移除。
從 .NET 9 開始,由於存在已知的安全性風險,且其 API 一律會對所有專案類型擲回 PlatformNotSupportedException,包括 Windows Forms 應用程式,因此 BinaryFormatter 不再受到支援。 如需了解 BinaryFormatter 所造成的風險及移除的理由,請參閱 BinaryFormatter 的移轉指南。
移除 BinaryFormatter 後,預計許多 Windows Forms 應用程式會受到影響,因此您必須採取行動來完成移轉至 .NET 9 或後續版本的動作。
BinaryFormatter 如何影響 Windows Forms
在 .NET 9 之前,Windows Forms 會使用 BinaryFormatter,按照預設的時間,將剪貼簿、拖放,和儲存或載入資源等情境的資料序列化和還原序列化。 從 .NET 9 開始,Windows Forms 和 WPF 則會針對這些情境,在內部使用 BinaryFormatter 的實作子集。 雖然在一般用途的序列化/還原序列化中,BinaryFormatter 的風險無法解決,但我們已採取措施對這些具有已知類型組合的極特定使用案例來降低風險。 至於類型未知或不支援者,仍然可以還原為 BinaryFormatter,這種情況下,除非在應用程式採取移轉步驟,否則它會擲回例外狀況。
Windows Forms 和 WPF 應用程式都可處理下列類型,以及這些類型的陣列和清單。 剪貼簿、拖放和設計時間的資源都將繼續使用這些類型,不需要任何移轉步驟。
bool
byte
char
decimal
double
int
sbyte
float
- TimeSpan
- DateTime
uint
string
nint
nuint
long
ulong
short
ushort
- PointF
- RectangleF
Windows Forms 也支援以下其他類型:
OLE 案例
如需了解 BinaryFormatter 的移除對於剪貼簿和拖放等 OLE 情境的影響,請參閱 Windows Forms 和 Windows Presentation Foundation 的 BinaryFormatter OLE 移轉指引。
資源 (ResX)
Windows Forms 設計工具
Windows Forms 跨處理序設計工具也會在內部使用 BinaryFormatter 來進行 ResX 序列化和還原序列化。
基於 Windows Forms 設計工具的標準行為,類型和屬性無需您的實行,就可能會參與序列化。 您可能不知道,系統會在 IComponent 導入 public
屬性,且該屬性於設計時間填入或經過編輯時使用 BinaryFormatter。 該屬性會在以下條件之下序列化為資源檔案:
- 在儲存設計工具的 Form 時,公用屬性內含資料。
- 該屬性並非唯讀。
- 該屬性在歸屬時不含
[DesignerSerializationVisibility(false)]
。 - 該屬性不含 DefaultValueAttribute。
- 該屬性在 CodeDOM 序列化程序中,沒有對應的
bool ShouldSerialize[PropertyName]
方法會傳回false
。 (注意:此方法可能有private
的範圍。) - 該屬性是不含 DesignerSerializer 的類型
如果這些陳述為真,設計工具就能判斷該屬性的類型是否有類型轉換器。 這麼一來,設計工具就會使用類型轉換器來序列化屬性內容。 否則,它會使用 BinaryFormatter 將內容序列化為資源檔案。 Windows Forms 已新增分析器,內含程式碼修正,藉此提高對這類行為 (BinaryFormatter 的序列化可能會在開發人員不知情時發生) 的注意。
在執行階段載入資源
之前已透過 BinaryFormatter 序列化為資源檔案的類型,將會繼續按照預期還原序列化,不需要作為 ResX 檔案內容的 BinaryFormatter 經認定為受信任的資料。 少數情況下,如果還原序列化因缺乏 BinaryFormatter 而無法發生,該類型會重新新增不支援的相容性套件。 如需詳細資訊,請參閱 BinaryFormatter 的移轉指南:相容性套件。 請注意,您需要額外採取將 System.Resources.Extensions.UseBinaryFormatter
應用程式內容切換為 true
的步驟,才能將 BinaryFormatter 用於資源。
透過 msbuild 產生資源檔
透過 msbuild 產生資源檔時,您可能會遇到 MSB3825
錯誤,指定在執行階段期間,可能會使用 BinaryFormatter 還原序列化二進位格式資源。 如上所述,這些資源不會使用 BinaryFormatter 還原序列化,而且可以將 GenerateResourceWarnOnBinaryFormatterUse
屬性設定為 false
來關閉此警告。 少數情況下,如果還原序列化因缺乏 BinaryFormatter 而無法發生,該類型會重新新增不支援的相容性套件。 如需詳細資訊,請參閱 BinaryFormatter 的移轉指南:相容性套件。 請注意,您需要額外採取將 System.Resources.Extensions.UseBinaryFormatter
應用程式內容切換為 true
的步驟,才能將 BinaryFormatter 用於資源。
從 BinaryFormatter 移轉到他處
如果在序列化和還原序列化期間,系統在受影響的情境中使用了本質上未經處理的類型,您必須採取動作來完成移轉至 .NET 9 或後續版本的程序。
OLE 案例
如需詳細了解如何在剪貼簿和拖放等情境從 BinaryFormatter 移轉,請參閱 Windows Forms 和 Windows Presentation Foundation 的 BinaryFormatter OLE 指南。
在設計時間內載入和儲存資源
在序列化為資源過程中,本質上未經處理的類型,例如以設計工具執行 ResX 情境的案例,從 BinaryFormatter 移轉的指定方式是確保參與序列化的類型或屬性已註冊 TypeConverter
。 如此一來,在序列化和還原序列化期間,TypeConverter
會用來取代原本使用 BinaryFormatter 的位置。 如需詳細了解如何實作類型轉換器,請參閱 TypeConverter
類別。
相容性因應措施 (不建議使用)
無法從 BinaryFormatter 移轉的 .NET 9 用戶可以安裝不支援的相容性套件。 如需詳細資訊,請參閱 BinaryFormatter 移轉指南:相容性套件。
警告
BinaryFormatter 很危險,會讓使用中的應用程式面臨攻擊風險,例如阻斷服務 (DoS)、資訊洩漏或遠端程式碼執行,因此不建議使用。 如需詳細了解 BinaryFormatter 所造成的風險,請參閱使用 BinaryFormatter 和相關類型的還原序列化風險。
問題
如果您的 Windows Forms 應用程式發生和 BinaryFormatter 序列化或還原序列化有關的非預期行為,請在 github.com/dotnet/winforms 提出問題,並表明問題與 BinaryFormatter 的移除有關。