BinaryFormatter 序列化方法在 ASP.NET 應用程式中已淘汰並禁止

BinaryFormatterFormatterIFormatter 上的 SerializeDeserialize 方法現已淘汰為警告。 此外,ASP.NET 應用程式依預設禁止使用 BinaryFormatter 序列化。

注意

在 .NET 7 中,受影響的 API 已被視為「錯誤」而淘汰。 如需詳細資訊,請參閱 BinaryFormatter 序列化 API 產生編譯器錯誤

變更描述

因為 BinaryFormatter 中出現安全性弱點,以下方法現已淘汰並會產生識別碼為 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

另請參閱