.NET 8 重大变更:BinaryFormatter 在大多数项目类型中被禁用
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
引言
在 .NET 8 中,微软继续推进其安全改进计划,对 BinaryFormatter
进行了更严格的限制。本文将详细介绍这一变更的背景、影响范围以及开发者应采取的应对措施。
BinaryFormatter 简介
BinaryFormatter
是 .NET 中一个历史悠久的二进制序列化工具,它可以将对象图转换为二进制格式,并能够完整地重建原始对象。然而,这种强大的功能也带来了严重的安全隐患:
- 类型安全风险:反序列化时可以实例化任意类型
- 数据篡改风险:二进制数据容易被修改
- 版本兼容性问题:类型结构变更后难以处理
变更内容
旧行为(.NET 7 及之前)
在 .NET 7 中:
BinaryFormatter.Serialize()
和BinaryFormatter.Deserialize()
方法被标记为过时- 编译时会显示错误警告
- 如果开发者抑制了过时警告,这些方法仍可在大多数项目类型中正常工作(ASP.NET、WASM 和 MAUI 除外)
新行为(.NET 8)
在 .NET 8 中:
- 除 Windows Forms 和 WPF 外,所有项目类型调用这些方法都会抛出
NotSupportedException
- 所有项目类型(包括 Windows Forms 和 WPF)中这些 API 仍保持过时(作为错误)状态
变更原因
这一变更是微软逐步淘汰 BinaryFormatter
计划的一部分。微软官方明确指出,由于 BinaryFormatter
存在严重的安全隐患和可靠性问题,最终将从 .NET 中完全移除。
影响范围
受影响的 API:
BinaryFormatter.Serialize(Stream, Object)
BinaryFormatter.Deserialize(Stream)
影响的项目类型:
- 控制台应用程序
- 类库
- ASP.NET Core 应用
- MAUI 应用
- WASM 应用
- 其他大多数项目类型
例外情况:
- Windows Forms 应用
- WPF 应用
应对策略
推荐方案:迁移到替代方案
微软强烈建议开发者迁移到更安全的序列化方案,包括但不限于:
- System.Text.Json:高性能、低内存占用的 JSON 序列化器
- XmlSerializer:基于 XML 的序列化方案
- Protocol Buffers:Google 开发的高效二进制序列化格式
- MessagePack:快速紧凑的二进制序列化格式
这些替代方案都提供了更好的安全控制和性能特性。
临时解决方案:启用兼容性开关
如果必须继续使用 BinaryFormatter
,可以通过修改项目文件添加兼容性开关:
<PropertyGroup>
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>
但需要注意:
- 这只是一个临时解决方案
- 未来版本可能会完全移除该开关
- 仍需承担使用
BinaryFormatter
的安全风险
迁移建议
步骤一:识别使用场景
检查代码库中 BinaryFormatter
的使用场景,包括:
- 持久化存储
- 进程间通信
- 网络传输
- 缓存机制
步骤二:评估替代方案
根据使用场景选择合适的替代方案:
- 配置存储:System.Text.Json
- 高性能通信:Protocol Buffers
- 兼容性要求:XmlSerializer
步骤三:逐步替换
建议采用渐进式替换策略:
- 在新代码中使用替代方案
- 逐步重构旧代码
- 实现双向兼容(如需要)
结论
.NET 8 对 BinaryFormatter
的限制是微软加强 .NET 平台安全性的重要举措。作为开发者,我们应该积极响应这一变更,评估现有代码库,并制定合理的迁移计划。虽然短期内可能需要投入一些重构工作,但从长远来看,采用更现代的序列化方案将带来更好的安全性、性能和可维护性。
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考