Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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)