API сериализации BinaryFormatter создают ошибки компилятора
В рамках плана долгосрочного прекращения работы BinaryFormatter мы продолжаем 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
его безопасности и надежности недостатков. 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 поведение этого коммутатора изменилось для управления поведением компиляции и времени выполнения узла . Значение этого параметра зависит от типа проекта, как описано в следующей таблице.
Тип проекта | Для свойства задано значение |
Для свойства задано значение |
Свойство опущено |
---|---|---|---|
Библиотека или общий компонент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)