共用方式為


binaryFormatter 串行化方法在 ASP.NET 應用程式中已過時且禁止

SerializeDeserialize 方法在 BinaryFormatterFormatterIFormatter 上現在被視為過時並會產生警告。 此外, BinaryFormatter ASP.NET 應用程式預設禁止串行化。

備註

在 .NET 7 中, 受影響的 API 已過時為 錯誤。 如需詳細資訊,請參閱 BinaryFormatter 串行化 API 產生編譯程序錯誤

變更描述

由於的安全性弱點,下列方法現在已過時,並產生編譯時期警告,標識碼為BinaryFormatter。 此外,在 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

另請參閱