BinaryFormatter 序列化方法已过时,并且已在 ASP.NET 应用中禁用
BinaryFormatterFormatter 和 IFormatter 上的 Serialize
和 Deserialize
方法现已过时,不再作为警告显示。 此外,ASP.NET 应用默认情况下禁止 BinaryFormatter 序列化。
注意
在 .NET 7 中,受影响的 API 已过时,报告为错误。 有关详细信息,请参阅 BinaryFormatter 序列化 API 生成编译器错误。
更改描述
由于 BinaryFormatter 存在安全漏洞,因此,以下方法现已过时,并生成 ID 为 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)