作為 BinaryFormatter 長期淘汰計劃的一部分,我們會繼續逐步移除程式庫中的功能,並逐步減少開發人員對該類型的使用。 從 .NET 7 開始,呼叫下列 API 會產生所有 C# 和 Visual Basic 專案類型的編譯時間錯誤:
- System.Exception.SerializeObjectState DocumentCompleted 事件
- BinaryFormatter.Serialize 方法
- BinaryFormatter.Deserialize 方法
- Formatter.Serialize(Stream, Object) 方法
- Formatter.Deserialize(Stream) 方法
- IFormatter.Serialize(Stream, Object) 方法
- IFormatter.Deserialize(Stream) 方法
先前的行為
由於 .NET 5,使用受影響的 Serialize 和 Deserialize 方法會產生標識符為 的編譯SYSLIB0011。 如需詳細資訊,請參閱 binaryFormatter 串行化方法在 ASP.NET 應用程式中已過時且禁止使用 (.NET 5) 。
Exception.SerializeObjectState使用事件不會產生錯誤。
新行為
從 .NET 7 開始,使用程式代碼中任何受影響的 API 會產生具有相同識別碼的編譯程式錯誤。 SYSLIB0011 如果您的專案符合下列所有準則,將會受到影響:
- 它是 C# 或 Visual Basic 專案。
- 其目標為
net7.0或更高版本。 - 它會直接呼叫其中一個 受影響的 API。
- 它尚未禁止
SYSLIB0011警告碼。
推出的版本
.NET 7
破壞性變更的類型
這項變更可能會影響 來源相容性。
變更的原因
作為 BinaryFormatter 長期淘汰計劃的一部分,我們會繼續逐步移除程式庫中的功能,並逐步減少開發人員對該類型的使用。
建議的動作
最佳做法是由於其安全性和可靠性缺陷,遷移離開 BinaryFormatter 。
BinaryFormatter 未來版本可能會從 .NET 中移除。 .NET 連結庫小組已經採取了一個立場,例如 System.Half 和 System.DateOnly 之類的最近類型不會與 BinaryFormatter相容。
如果您必須抑制錯誤,您可以遵循 原始廢止文章中的指引來執行此動作。 您也可以藉由設定將錯誤轉換成警告的項目屬性來停用整個錯誤專案(以符合 .NET 5/6 行為)。
警告
設定此屬性可能會變更主機行為。 請參閱 <EnableUnsafeBinaryFormatterSerialization> 屬性。
<PropertyGroup>
...
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>
備註
如果您的專案在啟用「將警告視為錯誤」的情況下進行編譯,編譯仍會失敗。 (這符合 .NET 5 和 .NET 6 SDK 中隨附的行為。如果是這種情況,您仍然需要在來源或項目檔的 SYSLIB0011 項目中隱藏<NoWarn>警告。
<EnableUnsafeBinaryFormatterSerialization> 屬性
屬性 <EnableUnsafeBinaryFormatterSerialization 是在 .NET 5 中引進的。 在 .NET 7 中,此切換器的行為改變,可同時控制 編譯與主機 執行時行為。 此參數的意義會根據項目類型而有所不同,如下表所述。
| 項目類型 | 屬性設定為 true |
屬性設定為 false |
屬性已省略 |
|---|---|---|---|
| 程式庫/共享元件1 | 受影響的 API 已被警告為過時。 除非您為應用程式啟用「警告為錯誤」,或抑制了 SYSLIB0011 警告碼,否則編譯將會成功。 |
受影響的 API 已過時,因為發生錯誤,除非隱藏錯誤,否則從程式代碼呼叫這些 API 將會在編譯階段失敗。 | 與false相同。 |
| Blazor 和 MAUI 應用程式2 | 對 BinaryFormatter 的呼叫會在執行時失敗。 |
對 BinaryFormatter 的呼叫會在執行時失敗。 |
對 BinaryFormatter 的呼叫會在執行時失敗。 |
| ASP.NET 應用程式 | 受影響的 API 已被警告為過時。 除非您為應用程式啟用「警告為錯誤」,或抑制了 SYSLIB0011 警告碼,否則編譯將會成功。 不論呼叫是否來自您的程式碼或您取用的相依性,執行時間都會 允許 呼叫 BinaryFormatter。 |
受影響的 API 已過時,因為發生錯誤,除非隱藏錯誤,否則從程式代碼呼叫這些 API 將會在編譯階段失敗。 運行時會禁止呼叫,不論呼叫是否來自您的程式碼或您取用的相依性。 | 與false相同。 |
| 桌面應用程式和其他所有應用程式類型 | 受影響的 API 已被警告為過時。 除非您為應用程式啟用「警告為錯誤」,或抑制了 SYSLIB0011 警告碼,否則編譯將會成功。 不論呼叫是否來自您的程式碼或您取用的相依性,執行時間都會 允許 呼叫 BinaryFormatter。 |
受影響的 API 已過時,因為發生錯誤,除非隱藏錯誤,否則從程式代碼呼叫這些 API 將會在編譯階段失敗。 運行時會禁止呼叫,不論呼叫是否來自您的程式碼或您取用的相依性。 | 受影響的 API 已過時,因為發生錯誤,除非隱藏錯誤,否則從程式代碼呼叫這些 API 將會在編譯階段失敗。 不論呼叫是否來自您的程式碼或您取用的相依性,執行時間都會 允許 呼叫 BinaryFormatter。 |
1運行時間原則是由應用程式主機所控制。 即使在你函式庫的專案檔案中將<EnableUnsafeBinaryFormatterSerialization>設定為true,BinaryFormatter的調用在執行時仍可能失敗。 程式庫無法覆蓋應用程式主機的執行時原則。
2 Blazor 和 MAUI 執行階段禁止呼叫 BinaryFormatter。 不管你設定了什麼值 , <EnableUnsafeBinaryFormatterSerialization>呼叫在執行時都會失敗。 請勿從 Blazor 或 MAUI 應用程式或要供 Blazor 或 MAUI 應用程式取用的函式庫呼叫這些 API。
受影響的 API
- System.Exception.SerializeObjectState
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize
- System.Runtime.Serialization.Formatter.Serialize(Stream, Object)
- System.Runtime.Serialization.Formatter.Deserialize(Stream)
- System.Runtime.Serialization.IFormatter.Serialize(Stream, Object)
- System.Runtime.Serialization.IFormatter.Deserialize(Stream)