本文档概述了删除 BinaryFormatter 对 OLE 和 Windows Forms (Windows Presentation Foundation) 中的 WPF 场景的影响。 有关删除 BinaryFormatter 中的 Windows Forms 带来的总体影响的信息,请参阅 Windows Forms 的 BinaryFormatter 迁移指南。 有关删除 BinaryFormatter 中的 WPF 带来的总体影响的信息,请参阅 WPF 的 BinaryFormatter 迁移指南。
BinaryFormatter 场景中的 OLE
剪贴板
除 OLE 和任何自定义格式外,System.Windows.Forms.DataFormats
和 System.Windows.DataFormats
中的所有标准 BinaryFormatter DataFormats 不会经历 DataFormats.Serializable
。 如果使用 DataFormats.Serializable
或自定义格式,当剪贴板场景涉及并非以内在方式处理的类型时,将使用 BinaryFormatter,具体如 Windows Forms 和 BinaryFormatter中所述。 尤其是要在使用你的类型调用 BinaryFormatter 或 System.Windows.Forms.Clipboard.SetData,以及调用 System.Windows.Clipboard.SetData 或 System.Windows.Forms.Clipboard.GetData 以获取你的类型时使用 System.Windows.Clipboard.GetData。 如果调用 BinaryFormatter 或 System.Windows.Forms.Clipboard.SetDataObject,也会使用 System.Windows.Clipboard.SetDataObject。 删除 BinaryFormatter 后,如果需要 BinaryFormatter,则在剪贴板上设置数据时不会出现异常情况。 相反,当你尝试从剪贴板获取未以内在方式处理的类型时,关于 BinaryFormatter 的字符串将被删除。
拖放功能
如果拖放场景涉及在序列化和反序列化过程中未以内在方式处理的类型,则在调用 BinaryFormatter 或 System.Windows.Forms.Control.DoDragDrop 时使用 System.Windows.DragDrop.DoDragDrop,并且数据已从进程中拖出。 当调用 BinaryFormatter 或 System.Windows.Forms.DataObject.GetData 时,也会使用 System.Windows.DataObject.GetData 来检索源自另一个进程的数据(如果未对类型进行内在处理)。 删除 BinaryFormatter 后,当尝试检索源自另一个进程的数据(其中未对类型进行内在处理)时,关于 BinaryFormatter 的字符串将被删除。
从 BinaryFormatter 迁出
剪贴板和拖放
对于剪贴板和拖放操作中使用的,但未以内在方式处理的类型,建议在将数据传递到剪贴板或拖放 API 之前,将这些类型格式化为 byte[]
或 string
有效负载。 使用 JSON 是实现此目的的一种方法。 需要进行调整,以处理接收 JSON 格式类型,这类似于对在剪贴板或拖放操作中使用 JSON 格式化类型所做的调整。 有关如何使用 JSON 序列化和反序列化类型的详细信息,请参阅如何将 .NET 对象编写为 JSON(序列化)。
问题
如果您使用 Windows Forms 或 WPF 应用程序时出现与 BinaryFormatter 序列化或反序列化相关的意外行为,请分别在 github.com/dotnet/winforms 或 github.com/dotnet/wpf 提交问题。