Serialize
和 Deserialize
方法在 BinaryFormatter、Formatter 和 IFormatter 上現在被視為過時並會產生警告。 此外, BinaryFormatter ASP.NET 應用程式預設禁止串行化。
備註
在 .NET 7 中, 受影響的 API 已過時為 錯誤。 如需詳細資訊,請參閱 BinaryFormatter 串行化 API 產生編譯程序錯誤。
變更描述
由於的安全性弱點,下列方法現在已過時,並產生編譯時期警告,標識碼為BinaryFormatter。 此外,在 ASP.NET Core 5.0 和更新的應用程式中,若 Web 應用程式未重新啟用NotSupportedException功能,則它們將拋出BinaryFormatter。
下列串行化方法也已過時併產生警告 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)