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