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

См. также