Windows Forms 和 Windows Presentation FoundationBinaryFormatterOLE 指南

本文档概述了删除 BinaryFormatter 对 Windows Forms 和 Windows Presentation Foundation (WPF) 中的 OLE 场景的影响。 有关删除 Windows Forms 中的 BinaryFormatter 带来的总体影响的信息,请参阅 BinaryFormatter 的 Windows Forms 迁移指南。 有关删除 WPF 中的 BinaryFormatter 带来的总体影响的信息,请参阅 BinaryFormatter 的 WPF 迁移指南

OLE 场景中的 BinaryFormatter

剪贴板

DataFormats.Serializable 和任何自定义格式外,System.Windows.Forms.DataFormatsSystem.Windows.DataFormats 中的所有标准 OLE DataFormats 不会经历 BinaryFormatter。 如果使用 DataFormats.Serializable 或自定义格式,当剪贴板场景涉及并非以内在方式处理的类型时,将使用 BinaryFormatter,具体如 BinaryFormatterWPF 迁移指南 - 二进制格式化程序的 Windows Forms 迁移指南中所述。 尤其是要在使用你的类型调用 System.Windows.Forms.Clipboard.SetDataSystem.Windows.Clipboard.SetData,以及调用 System.Windows.Forms.Clipboard.GetDataSystem.Windows.Clipboard.GetData 以获取你的类型时使用 BinaryFormatter。 如果调用 System.Windows.Forms.Clipboard.SetDataObjectSystem.Windows.Clipboard.SetDataObject,也会使用 BinaryFormatter。 删除 BinaryFormatter 后,如果需要 BinaryFormatter,则在剪贴板上设置数据时不会出现异常情况。 相反,当你尝试从剪贴板获取未以内在方式处理的类型时,关于 BinaryFormatter 的字符串将被删除。

拖放功能

如果拖放场景涉及在序列化和反序列化过程中未以内在方式处理的类型,则在调用 System.Windows.Forms.Control.DoDragDropSystem.Windows.DragDrop.DoDragDrop 时使用 BinaryFormatter,并且数据已从进程中拖出。 当调用 System.Windows.Forms.DataObject.GetDataSystem.Windows.DataObject.GetData 时,也会使用 BinaryFormatter 来检索源自另一个进程的数据(如果未对类型进行内在处理)。 删除 BinaryFormatter 后,当尝试检索源自另一个进程的数据(其中未对类型进行内在处理)时,关于 BinaryFormatter 的字符串将被删除。

从 BinaryFormatter 迁出

剪贴板和拖放

对于剪贴板和拖放操作中使用的,但未以内在方式处理的类型,建议在将数据传递到剪贴板或拖放 API 之前,将这些类型格式化为 byte[]string 有效负载。 使用 JSON 是实现此目的的一种方法。 需要进行调整,以处理接收 JSON 格式类型,这类似于对在剪贴板或拖放操作中使用 JSON 格式化类型所做的调整。 有关如何使用 JSON 序列化和反序列化类型的详细信息,请参阅如何将 .NET 对象编写为 JSON(序列化)

问题

如果 Windows Forms 或 WPF 应用在 BinaryFormatter 序列化或反序列化方面出现意外行为,请分别前往 github.com/dotnet/winformsgithub.com/dotnet/wpf 提交问题。