BinaryFormatter 序列化方法已过时,并且已在 ASP.NET 应用中禁用

BinaryFormatterFormatterIFormatter 上的 SerializeDeserialize 方法现已过时,不再作为警告显示。 此外,ASP.NET 应用默认情况下禁止 BinaryFormatter 序列化。

注意

在 .NET 7 中,受影响的 API 已过时,报告为错误。 有关详细信息,请参阅 BinaryFormatter 序列化 API 生成编译器错误

更改描述

由于 BinaryFormatter 存在安全漏洞,因此,以下方法现已过时,并生成 ID 为 SYSLIB0011 的编译时警告。 此外,在 ASP.NET Core 5.0 及更高版本的应用中,除非 Web 应用已重新启用 BinaryFormatter 功能,否则它们会引发 NotSupportedException

以下序列化方法现在也已过时并生成警告 SYSLIB0011,但没有行为变更:

引入的版本

5.0

更改原因

在 .NET 生态系统中逐步停用 BinaryFormatter 的过程中,这些方法被标记为“过时”。

  • 停止在代码中使用 BinaryFormatter。 此时,考虑使用 JsonSerializerXmlSerializer。 有关详细信息,请参阅 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

另请参阅