Методы сериализации 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

См. также