BinaryFormatter 序列化方法在 ASP.NET 应用中已过时和禁止

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

注释

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

更改描述

由于存在BinaryFormatter,以下方法现已过时,并生成具有 ID SYSLIB0011的编译时警告。 此外,在 ASP.NET Core 5.0 及更高版本的应用中,除非 Web 应用重新启用 NotSupportedException 功能,否则这些应用将抛出 BinaryFormatter

以下序列化方法也已过时并生成警告 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

另请参阅