BinaryFormatter 序列化方法在 ASP.NET 應用程式中已淘汰並禁止
BinaryFormatter、Formatter 和 IFormatter 上的 Serialize
和 Deserialize
方法現已淘汰為警告。 此外,ASP.NET 應用程式依預設禁止使用 BinaryFormatter 序列化。
注意
在 .NET 7 中,受影響的 API 已被視為「錯誤」而淘汰。 如需詳細資訊,請參閱 BinaryFormatter 序列化 API 產生編譯器錯誤。
變更描述
因為 BinaryFormatter 中出現安全性弱點,以下方法現已淘汰並會產生識別碼為 SYSLIB0011
的編譯時期警告。 此外,在 ASP.NET Core 5.0 和更新應用程式中,除非 Web 應用程式重新啟用 BinaryFormatter 功能,否則會擲回 NotSupportedException。
下列序列化方法也已淘汰並會產生警告 SYSLIB0011
,但沒有行為變更:
- Formatter.Serialize(Stream, Object)
- Formatter.Deserialize(Stream)
- IFormatter.Serialize(Stream, Object)
- IFormatter.Deserialize(Stream)
導入的版本
5.0
變更原因
為了減少在 .NET 生態系統中使用 BinaryFormatter 的頻率,這些方法會標記為已淘汰。
建議的動作
停止在您的程式碼中使用 BinaryFormatter。 請考慮改用 JsonSerializer 或 XmlSerializer。 如需詳細資訊,請參閱 BinaryFormatter 安全性指南。
您可以暫時隱藏 BinaryFormatter 編譯時期警告
SYSLIB0011
。 建議您在選擇此選項之前,徹底評估您的程式碼是否有風險。 隱藏警告最簡單的方式是使用#pragma
指示詞包住個別呼叫站台。// Now read the purchase order back from disk using (var readStream = new FileStream("myfile.bin", FileMode.Open)) { var formatter = new BinaryFormatter(); #pragma warning disable SYSLIB0011 return (PurchaseOrder)formatter.Deserialize(readStream); #pragma warning restore SYSLIB0011 }
您也可以在專案檔中隱藏警告。
<PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net5.0</TargetFramework> <!-- Disable "BinaryFormatter is obsolete" warnings for entire project --> <NoWarn>$(NoWarn);SYSLIB0011</NoWarn> </PropertyGroup>
如果您在專案檔中隱藏警告,則會隱藏專案中所有程式碼檔案的警告。 隱藏
SYSLIB0011
並不會隱藏因為使用其他已淘汰 API 所產生的警告。如要在 ASP.NET 應用程式中繼續使用 BinaryFormatter,您可以在專案檔中重新加以啟用。 不過,強烈建議不要這麼做。 如需詳細資訊,請參閱 BinaryFormatter 安全性指南。
<PropertyGroup> <TargetFramework>net5.0</TargetFramework> <!-- Warning: Setting the following switch is *NOT* recommended in web apps. --> <EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization> </PropertyGroup>
如需建議動作的詳細資訊,請參閱解決 BinaryFormatter 過時與停用錯誤。
受影響的 API
- 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)