BinaryFormatter 的 Windows Presentation Foundation (WPF) 迁移指南

移除 BinaryFormatter

从 .NET 9 开始,BinaryFormatter 不再受支持,因为它存在已知的安全风险,而且它的 API 总是为所有项目类型抛出 PlatformNotSupportedException,包括 WPF 应用。 有关 BinaryFormatter 带来的风险以及移除它的原因的详细信息,请参阅 BinaryFormatter 迁移指南

移除 BinaryFormatter 后,预期许多 WPF 应用程序将受到影响,你需要采取行动来完成到 .NET 9 或更高版本的迁移。

BinaryFormatter 会如何影响 WPF

在 .NET 9 之前,Windows Presentation Foundation (WPF) 使用 BinaryFormatter 来序列化和反序列化数据,涉及的方案包括日记中的剪贴板、拖放、加载/存储状态等。 从 .NET 9 开始,WPF 和 Windows 窗体在这些方案中会内部使用 BinaryFormatter 实现的一个子集。 虽然无法在通用序列化/反序列化中解决 BinaryFormatter 的风险,但我们已采取措施来在这些非常具体且已知类型的用例中缓解风险。 对于未知或不受支持的类型,仍然可以回退到 BinaryFormatter,除非在应用程序中采取迁移步骤,否则将抛出 PlatformNotSupportedException

WPF 和 WinForms 应用都处理以下类型,以及这些类型的数组和列表。 在日记中,剪贴板、拖放和 Avalon 绑定将继续使用这些类型,而无需执行任何迁移步骤。

OLE 方案

有关移除 BinaryFormatter 对剪贴板和拖放等 OLE 方案的影响方面的信息以及迁移指南,请参阅 Windows 窗体和 Windows Presentation Foundation BinaryFormatter OLE 指南

你可以参考我们使用 BinaryFormatter 作为回退来读取/保存对象的函数来处理:OLE 方案的 SaveObjectToHandleReadObjectFromHandle

日志

在这种情况下,我们需要存储或加载状态,同时在 WPF 中管理导航历史记录。

若要加载/保存,我们需调用 DataStream 类的 LoadSubStreams/ SaveSubStreams。 如果使用的元素不是由新实现处理的已知类型的一部分,它将使用 BinaryFormatter

当开发人员使用 NavigateJournalEntry 进行导航时, GoForward或者 GoBack将节点的数据加载或保存到流中以保存状态。 如果在序列化/反序列化期间未内在处理涉及的类型,则会使用 BinaryFormatter

参考:DataStream.cs

无法从 BinaryFormatter 迁移的 .NET 9 用户可以安装不受支持的兼容性包。 有关详细信息,请参阅 BinaryFormatter 迁移指南:兼容性包

注意

BinaryFormatter 很危险,不推荐使用,因为它会使消耗的应用面临拒绝服务 (DoS)、信息泄露或远程代码执行等攻击的风险。 有关 BinaryFormatter 带来的风险的详细信息,请参阅使用 BinaryFormatter 和相关类型的反序列化风险

问题

如果你在 WPF 应用程序的 BinaryFormatter 方面遇到意外行为,请在 dotnet/wpf/issues 处提出问题,并指出此问题与 BinaryFormatter 的移除相关。