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


API сериализации BinaryFormatter создают ошибки компилятора

В рамках плана долгосрочного снятия с использования BinaryFormatter мы продолжаем сокращать функциональные возможности в наших библиотеках и отучать разработчиков от использования типа. Начиная с .NET 7 вызовы следующих API создают ошибки во время компиляции для всех типов проектов C# и Visual Basic:

Предыдущее поведение

Начиная с .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

См. также