.NET 9 重大变更:BinaryFormatter 核心实现被移除并始终抛出异常
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
背景介绍
在 .NET 生态系统中,BinaryFormatter
长期以来一直是开发者进行二进制序列化的主要工具之一。然而,随着安全意识的提升和技术的发展,微软决定在 .NET 9 中彻底移除其核心实现。这一决定并非突然,而是经过多个版本逐步淘汰计划的结果。
变更内容
从 .NET 9 Preview 6 开始,System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
的核心实现已被完全移除。现在,任何尝试创建 BinaryFormatter
实例或使用其序列化/反序列化方法的操作都会抛出异常。
变更前后对比
旧行为:
- 可以创建
BinaryFormatter
实例 - 能够正常进行对象的序列化和反序列化操作
- 虽然从 .NET 5 开始已被标记为过时,但仍可通过配置启用
新行为:
- 尝试创建
BinaryFormatter
实例会立即抛出异常 - 所有序列化/反序列化操作都会失败
- 之前用于启用
BinaryFormatter
的配置选项已被移除
变更原因
这一变更主要基于以下安全考虑:
- 安全问题:
BinaryFormatter
的设计存在根本性安全缺陷,容易成为攻击媒介 - 不可控风险:它允许执行任意代码,无法通过简单修补解决安全问题
- 现代替代方案:已有更安全、更高效的序列化方案可供选择
影响范围
这一变更会影响所有使用 BinaryFormatter
的 .NET 9 应用程序,特别是:
- 使用二进制序列化保存应用状态的程序
- 依赖
BinaryFormatter
进行进程间通信的系统 - 需要持久化复杂对象图的遗留代码
迁移建议
1. 评估替代方案
根据你的具体需求,可以考虑以下替代方案:
- JSON:
System.Text.Json
或Newtonsoft.Json
用于简单数据结构 - XML:
System.Xml.Serialization
用于需要人类可读格式的场景 - Protocol Buffers:Google 的高效二进制格式,适合性能敏感场景
- MessagePack:另一种高效的二进制序列化格式
2. 迁移步骤
- 代码审计:查找项目中所有使用
BinaryFormatter
的地方 - 数据兼容性:评估现有序列化数据的迁移路径
- 逐步替换:按模块或功能逐步替换序列化方案
- 测试验证:确保新方案在所有边界条件下表现正常
3. 特殊情况处理
如果确实需要继续使用 BinaryFormatter
(例如维护遗留系统),可以通过以下方式:
- 使用第三方提供的
BinaryFormatter
实现包 - 明确了解并接受相关安全风险
- 实施额外的安全措施来缓解潜在威胁
技术细节
被移除的核心功能包括:
BinaryFormatter
类的所有公共构造函数Serialize
和Deserialize
方法- 所有相关的配置开关和兼容性设置
总结
BinaryFormatter
的移除是 .NET 平台安全加固的重要一步。虽然这会给部分项目带来迁移成本,但从长远来看,采用更现代的序列化方案将提高应用程序的安全性和可维护性。建议开发者尽早规划迁移工作,避免在升级到 .NET 9 时遇到兼容性问题。
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考