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


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

В рамках плана долгосрочного прекращения работы 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 его безопасности и надежности недостатков. 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

См. также