Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В рамках плана долгосрочного снятия с использования BinaryFormatter мы продолжаем сокращать функциональные возможности в наших библиотеках и отучать разработчиков от использования типа. Начиная с .NET 7 вызовы следующих API создают ошибки во время компиляции для всех типов проектов C# и Visual Basic:
- событие System.Exception.SerializeObjectState
- BinaryFormatter.SerializeМетод
- BinaryFormatter.DeserializeМетод
- Formatter.Serialize(Stream, Object)Метод
- Formatter.Deserialize(Stream)Метод
- IFormatter.Serialize(Stream, Object)Метод
- IFormatter.Deserialize(Stream)Метод
Предыдущее поведение
Начиная с .NET 5, использование затронутых методов Serialize
и Deserialize
приводило к выдаче компилятором предупреждения с идентификаторомSYSLIB0011
. Дополнительные сведения см. в статье "Методы сериализации BinaryFormatter" устарели и запрещены в приложениях ASP.NET (.NET 5).
При использовании события Exception.SerializeObjectState не произошла ошибка.
Новое поведение
Начиная с .NET 7, используя любой из затронутых API в коде, возникает ошибка компилятора с тем же идентификатором SYSLIB0011
. Ваш проект будет затронут, если он соответствует всем следующим критериям:
- Это проект C# или Visual Basic.
- Он нацелен на
net7.0
или выше. - Он напрямую вызывает один из затронутых API.
- Он еще не устраняет
SYSLIB0011
код предупреждения.
Представленная версия
.NET 7
Тип разрушающего изменения
Это изменение может повлиять на совместимость исходного кода .
Причина изменения
В рамках плана долгосрочного снятия с использования BinaryFormatter мы продолжаем сокращать функциональные возможности в наших библиотеках и отучать разработчиков от использования типа.
Рекомендуемое действие
Наилучший способ — перейти от BinaryFormatter
из-за недостатков в безопасности и надежности.
BinaryFormatter
может быть удален из .NET в будущем выпуске. Команда библиотек .NET уже заявила, что такие недавние типы, как System.Half и System.DateOnly, не будут совместимы с BinaryFormatter
.
Если вам нужно подавить ошибки, вы можете сделать это, следуя рекомендациям в исходной статье об устаревании. Вы также можете отключить ошибку во всём проекте, задав для проекта свойство, которое преобразует ошибку обратно в предупреждение, чтобы соответствовать поведению .NET 5/6.
Предупреждение
Установка этого свойства может изменить поведение узла. См. <свойство EnableUnsafeBinaryFormatterSerialization>.
<PropertyGroup>
...
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>
Замечание
Если проект компилируется с включенными предупреждениями в качестве ошибок, компиляция по-прежнему завершится ошибкой. (Это соответствует поведению, отправленном в пакетах SDK для .NET 5 и .NET 6.) Если это так, вам по-прежнему потребуется отключить SYSLIB0011
предупреждение в источнике или в элементе файла <NoWarn>
проекта.
<Свойство EnableUnsafeBinaryFormatterSerialization>
Свойство <EnableUnsafeBinaryFormatterSerialization
было введено в .NET 5. В .NET 7 поведение этого переключателя изменилось для управления как компиляцией, так и поведением во время выполнения хоста. Значение этого параметра зависит от типа проекта, как описано в следующей таблице.
Тип проекта | Значение свойства установлено на true |
Значение свойства установлено на false |
Свойство пропущено |
---|---|---|---|
Библиотека или общий компонент1 | Устарение затронутых API служит предупреждением. Компиляция завершится успешно, если вы не включили "предупреждения в качестве ошибок" для приложения или вы подавили SYSLIB0011 код предупреждения. |
Использование затронутых API рассматривается как ошибка, так как они устарели. Вызовы из вашего кода к этим API приведут к сбою во время компиляции, если ошибка не будет подавлена. | (То же, что и для false .) |
Приложения Blazor и MAUI2 | Вызовы BinaryFormatter завершатся сбоем во время исполнения. |
Вызовы BinaryFormatter завершатся сбоем во время исполнения. |
Вызовы BinaryFormatter завершатся сбоем во время исполнения. |
Приложение ASP.NET | Устарение затронутых API служит предупреждением. Компиляция завершится успешно, если вы не включили "предупреждения в качестве ошибок" для приложения или вы подавили SYSLIB0011 код предупреждения. Среда выполнения разрешает вызовы BinaryFormatter независимо от того, исходит ли вызов из кода или из зависимостей, которые вы используете. |
Использование затронутых API рассматривается как ошибка, так как они устарели. Вызовы из вашего кода к этим API приведут к сбою во время компиляции, если ошибка не будет подавлена. Среда выполнения будет запрещать вызовы BinaryFormatter независимо от того, исходит ли вызов из кода или из зависимостей, которые вы используете. |
(То же, что и для false .) |
Настольные приложения и все другие типы приложений | Устарение затронутых API служит предупреждением. Компиляция завершится успешно, если вы не включили "предупреждения в качестве ошибок" для приложения или вы подавили SYSLIB0011 код предупреждения. Среда выполнения разрешает вызовы BinaryFormatter независимо от того, исходит ли вызов из кода или из зависимостей, которые вы используете. |
Использование затронутых API рассматривается как ошибка, так как они устарели. Вызовы из вашего кода к этим API приведут к сбою во время компиляции, если ошибка не будет подавлена. Среда выполнения будет запрещать вызовы BinaryFormatter независимо от того, исходит ли вызов из кода или из зависимостей, которые вы используете. |
Использование затронутых API рассматривается как ошибка, так как они устарели. Вызовы из вашего кода к этим API приведут к сбою во время компиляции, если ошибка не будет подавлена. Среда выполнения разрешает вызовы BinaryFormatter независимо от того, исходит ли вызов из кода или из зависимостей, которые вы используете. |
1Политика среды выполнения управляется узлом приложения. Вызовы в BinaryFormatter
могут все равно завершиться сбоем во время выполнения, даже если <EnableUnsafeBinaryFormatterSerialization>
установлено на true
в файле проекта вашей библиотеки. Библиотеки не могут переопределить политику среды выполнения хоста приложения.
2Среды выполнения Blazor и MAUI запрещают вызовы BinaryFormatter
. Независимо от заданного значения <EnableUnsafeBinaryFormatterSerialization>
вызовы завершаются сбоем во время выполнения. Не вызывайте эти API из приложений Blazor или MAUI или из библиотек, предназначенных для использования приложениями Blazor или MAUI.
Затронутые API
- System.Exception.SerializeObjectState
- 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)