Поделиться через


Методы сериализации BinaryFormatter устарели и запрещены в приложениях ASP.NET

Serialize и Deserialize методы в BinaryFormatter, Formatter и IFormatter теперь считаются устаревшими и вызовут предупреждение. Кроме того, BinaryFormatter сериализация запрещена по умолчанию для приложений ASP.NET.

Замечание

В .NET 7 затронутые API объявлены устаревшими как ошибка. Дополнительные сведения см. в разделе API сериализации BinaryFormatter, которые приводят к ошибкам компилятора.

Описание изменения

Из-за уязвимостей безопасности в BinaryFormatter, следующие методы теперь устарели и вызывают предупреждение во время компиляции с идентификатором SYSLIB0011. Кроме того, в приложениях ASP.NET Core 5.0 и более поздних версий они будут генерировать исключение NotSupportedException, если веб-приложение не включило повторно функциональность BinaryFormatter.

Следующие методы сериализации также устарели и создают предупреждение SYSLIB0011, но не имеют изменений в поведении:

Представленная версия

5,0

Причина изменения

Эти методы помечены как устаревшие в рамках усилий по уменьшению использования BinaryFormatter в экосистеме .NET.

  • Остановите использование 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.

  • Чтобы продолжить использование BinaryFormatter в ASP.NET приложениях, его можно повторно включить в файле проекта. Однако настоятельно рекомендуется не делать этого. Дополнительные сведения см. в руководстве по безопасности BinaryFormatter.

    <PropertyGroup>
      <TargetFramework>net5.0</TargetFramework>
      <!-- Warning: Setting the following switch is *NOT* recommended in web apps. -->
      <EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
    </PropertyGroup>
    

Дополнительные сведения о рекомендуемых действиях см. в разделе «Устранение ошибок устаревания и отключения BinaryFormatter».

Затронутые API

См. также