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 绑定将继续使用这些类型,而无需执行任何迁移步骤。
bool
byte
char
decimal
double
int
sbyte
float
- TimeSpan
- DateTime
uint
string
nint
nuint
long
ulong
short
ushort
- PointF
- RectangleF
OLE 方案
有关移除 BinaryFormatter 对剪贴板和拖放等 OLE 方案的影响方面的信息以及迁移指南,请参阅 Windows 窗体和 Windows Presentation Foundation BinaryFormatter OLE 指南。
你可以参考我们使用 BinaryFormatter 作为回退来读取/保存对象的函数来处理:OLE 方案的 SaveObjectToHandle 和 ReadObjectFromHandle
日志
在这种情况下,我们需要存储或加载状态,同时在 WPF 中管理导航历史记录。
若要加载/保存,我们需调用 DataStream
类的 LoadSubStreams/ SaveSubStreams。 如果使用的元素不是由新实现处理的已知类型的一部分,它将使用 BinaryFormatter。
当开发人员使用 Navigate
JournalEntry 进行导航时, GoForward
或者 GoBack
将节点的数据加载或保存到流中以保存状态。 如果在序列化/反序列化期间未内在处理涉及的类型,则会使用 BinaryFormatter。
兼容性解决方法(不推荐)
无法从 BinaryFormatter 迁移的 .NET 9 用户可以安装不受支持的兼容性包。 有关详细信息,请参阅 BinaryFormatter 迁移指南:兼容性包。
注意
BinaryFormatter 很危险,不推荐使用,因为它会使消耗的应用面临拒绝服务 (DoS)、信息泄露或远程代码执行等攻击的风险。 有关 BinaryFormatter 带来的风险的详细信息,请参阅使用 BinaryFormatter 和相关类型的反序列化风险。
问题
如果你在 WPF 应用程序的 BinaryFormatter 方面遇到意外行为,请在 dotnet/wpf/issues 处提出问题,并指出此问题与 BinaryFormatter 的移除相关。