Windows Forms Руководство по миграции BinaryFormatter
BinaryFormatter удаление
Начиная с .NET 9, BinaryFormatter больше не поддерживается из-за известных PlatformNotSupportedException, включая Windows Forms приложения. Дополнительные сведения о рисках BinaryFormatter и причине его удаления см. в руководстве BinaryFormatter по миграции.
При BinaryFormatterудалении ожидается, что многие Windows Forms приложения будут затронуты, и вам потребуется принять меры для завершения миграции в .NET 9 или более поздней версии.
Как BinaryFormatter влияет Windows Forms
До .NET 9 используется Windows FormsBinaryFormatter для сериализации и десериализации данных для таких сценариев, как буфер обмена, перетаскивание и хранение или загрузка ресурсов во время разработки. Начиная с .NET 9 и Windows Forms WPF используют подмножество BinaryFormatter реализации внутри этих сценариев. Хотя BinaryFormatterриски не могут быть устранены в сериализации и десериализации общего назначения, были приняты меры по устранению рисков в этих очень конкретных случаях использования с известным набором типов. Резервная BinaryFormatter копия по-прежнему находится на месте для неизвестных или неподдерживаемых типов, что приведет к возникновению исключений, если в приложении не выполняются шаги по миграции.
Windows Forms и приложения WPF обрабатывают следующие типы, а также массивы и списки этих типов. Буфер обмена, перетаскивание и ресурсы времени разработки будут продолжать работать с этими типами без каких-либо шагов миграции.
bool
byte
char
decimal
double
int
sbyte
float
- TimeSpan
- DateTime
uint
string
nint
nuint
long
ulong
short
ushort
- PointF
- RectangleF
Windows Forms также поддерживает следующие дополнительные типы:
Сценарии OLE
Сведения об удалении эффектов имеются в сценариях BinaryFormatter OLE, таких как буфер обмена и перетаскивание, а также рекомендации по миграции, а BinaryFormatter по миграции в Windows Presentation Foundation OLE.
Ресурсы (ResX)
Windows Forms Конструктор
Конструктор Windows Forms внепроцессных процессов также использует BinaryFormatter внутренне для сериализации и десериализации ResX.
Типы и свойства могут участвовать в сериализации без понимания стандартного поведения конструктора Windows Forms . Один из способов BinaryFormatter использования, о которых вы можете не знать, заключается в том, что public
IComponent свойство введено, а это свойство заполняется или редактируется во время разработки. Это свойство сериализуется в файлы ресурсов в следующих условиях:
- Общедоступное свойство содержит данные во время Form сохранения в конструкторе.
- Это свойство не доступно только для чтения.
- Это свойство не относится к
[DesignerSerializationVisibility(false)]
. - Это свойство не имеет DefaultValueAttribute.
- Это свойство не имеет соответствующего
bool ShouldSerialize[PropertyName]
метода, который возвращаетсяfalse
во время процесса сериализации CodeDOM. (Примечание. Метод может иметьprivate
область.) - Это свойство является типом, который не имеет DesignerSerializer
Если эти операторы имеют значение true, конструктор определяет, имеет ли тип этого свойства преобразователь типов. В этом случае конструктор использует преобразователь типов для сериализации содержимого свойства. В противном случае используется BinaryFormatter для сериализации содержимого в файл ресурса. Windows Forms добавил анализаторы вместе с исправлениями кода, которые помогают повысить осведомленность об этом типе поведения, где BinaryFormatter сериализация может происходить без знаний разработчика.
Загрузка ресурса во время выполнения
Типы, которые ранее были сериализованы в файлы ресурсов, BinaryFormatter будут продолжать десериализировать, как ожидалось, без необходимости BinaryFormatter , так как содержимое файлов ResX считается доверенными данными. В редких случаях десериализация не может происходить без BinaryFormatterнее, ее можно добавить обратно с неподдерживаемого пакета совместимости. Дополнительные сведения см BinaryFormatter . в руководстве по миграции: пакет совместимости. Обратите внимание, что для ресурсов требуется System.Resources.Extensions.UseBinaryFormatter
дополнительный шаг настройки true
контекста BinaryFormatter приложения.
Создание файлов ресурсов с помощью msbuild
При создании файлов ресурсов с помощью msbuild может возникнуть MSB3825
ошибка, указывающая, что двоичные отформатированные ресурсы могут быть десериализированы во BinaryFormatter время выполнения. Как указано выше, эти ресурсы не будут десериализировать использование, BinaryFormatter и это предупреждение можно отключить, задав для свойства GenerateResourceWarnOnBinaryFormatterUse
значение false
. В редких случаях десериализация не может происходить без BinaryFormatterнее, ее можно добавить обратно с неподдерживаемого пакета совместимости. Дополнительные сведения см BinaryFormatter . в руководстве по миграции: пакет совместимости. Обратите внимание, что для ресурсов требуется System.Resources.Extensions.UseBinaryFormatter
дополнительный шаг настройки true
контекста BinaryFormatter приложения.
Миграция от BinaryFormatter
Если типы, которые не обрабатываются внутренне во время сериализации и десериализации, используются в затронутых сценариях, вам потребуется принять меры для завершения миграции в .NET 9 или более поздней версии.
Сценарии OLE
Дополнительные сведения о переходе из буфера обмена и перетаскивания смBinaryFormatter Для Windows Presentation Foundation.BinaryFormatter
Загрузка и сохранение ресурсов во время разработки
Для типов, которые не обрабатываются внутренне во время сериализации в ресурсы, например в случае конструктора с сценариями ResX, предписанный способ миграции из BinaryFormatter него заключается в том, чтобы обеспечить TypeConverter
регистрацию для типа или свойства, участвующих в сериализации. Таким образом, во время сериализации и десериализации используется TypeConverter
вместо того, где BinaryFormatter когда-то использовалось. Дополнительные сведения о реализации преобразователя типов см. в разделе TypeConverter
"Класс".
Обходное решение совместимости (не рекомендуется)
Пользователи .NET 9, которые не могут перейти от BinaryFormatter него, могут установить неподдерживаемый пакет совместимости. Дополнительные сведения см BinaryFormatter . в руководстве по миграции: пакет совместимости.
Внимание
BinaryFormatter является опасным и не рекомендуется, так как он ставит использование приложений под угрозу для атак, таких как отказ в обслуживании (DoS), раскрытие информации или удаленное выполнение кода. Дополнительные сведения о рисках см. в разделе о рисках BinaryFormatter десериализации в использовании BinaryFormatter и связанных типах.
Проблемы
Если вы сталкиваетесь с непредвиденным поведением приложения Windows Forms в связи с сериализацией или десериализацией BinaryFormatter, сообщите о проблеме на github.com/dotnet/winforms и укажите, что проблема связана с удалением BinaryFormatter.