Методы сериализации 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
, но изменений в их поведении не произошло:
- Formatter.Serialize(Stream, Object)
- Formatter.Deserialize(Stream)
- IFormatter.Serialize(Stream, Object)
- IFormatter.Deserialize(Stream)
Представленные версии
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
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize
- System.Runtime.Serialization.Formatter.Serialize(Stream, Object)
- System.Runtime.Serialization.Formatter.Deserialize(Stream)
- System.Runtime.Serialization.IFormatter.Serialize(Stream, Object)
- System.Runtime.Serialization.IFormatter.Deserialize(Stream)