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


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 обрабатывают следующие типы, а также массивы и списки этих типов. Буфер обмена, перетаскивание и ресурсы времени разработки будут продолжать работать с этими типами без каких-либо шагов миграции.

Windows Forms также поддерживает следующие дополнительные типы:

Сценарии OLE

Сведения об удалении эффектов имеются в сценариях BinaryFormatter OLE, таких как буфер обмена и перетаскивание, а также рекомендации по миграции, а BinaryFormatter по миграции в Windows Presentation Foundation OLE.

Ресурсы (ResX)

Windows Forms Конструктор

Конструктор Windows Forms внепроцессных процессов также использует BinaryFormatter внутренне для сериализации и десериализации ResX.

Типы и свойства могут участвовать в сериализации без понимания стандартного поведения конструктора Windows Forms . Один из способов BinaryFormatter использования, о которых вы можете не знать, заключается в том, что publicIComponent свойство введено, а это свойство заполняется или редактируется во время разработки. Это свойство сериализуется в файлы ресурсов в следующих условиях:

  • Общедоступное свойство содержит данные во время 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.