.NET Core 技术解析:BinaryFormatter 序列化 API 在 .NET 7 中的重大变更
前言
在 .NET 生态系统中,BinaryFormatter 长期以来一直是序列化和反序列化对象的重要工具。然而,随着技术的发展和安全意识的提高,微软正在逐步淘汰这一组件。本文将深入解析 .NET 7 中关于 BinaryFormatter 的重大变更,帮助开发者理解这一变化并做好迁移准备。
BinaryFormatter 的问题背景
BinaryFormatter 存在几个关键问题:
- 安全风险:它允许执行任意代码,可能成为攻击载体
- 可靠性问题:类型保真度可能导致版本兼容性问题
- 性能问题:相比现代序列化方案效率较低
基于这些原因,微软从 .NET 5 开始就逐步淘汰 BinaryFormatter,并在 .NET 7 中进一步强化了这一策略。
.NET 7 中的变更详情
从警告升级为错误
在 .NET 7 中,以下 API 的调用将产生编译时错误(错误代码 SYSLIB0011):
Exception.SerializeObjectState事件BinaryFormatter.Serialize和BinaryFormatter.Deserialize方法Formatter和IFormatter接口的序列化/反序列化方法
受影响的项目类型
这一变更会影响所有满足以下条件的项目:
- C# 或 Visual Basic 项目
- 目标框架为
net7.0或更高版本 - 直接调用上述受影响的 API
- 未主动抑制
SYSLIB0011警告
迁移建议
最佳实践:完全迁移
微软强烈建议开发者迁移到更现代的序列化方案,如:
System.Text.Json:高性能、低内存占用的 JSON 序列化器XmlSerializer:XML 格式的序列化方案Protobuf:Google 的高效二进制协议
临时解决方案
如果必须暂时保留 BinaryFormatter 的使用,可以通过以下方式处理:
-
项目文件配置:
<PropertyGroup> <EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization> </PropertyGroup>这将把错误降级为警告(与 .NET 5/6 行为一致)
-
代码中抑制警告:
#pragma warning disable SYSLIB0011 // 使用 BinaryFormatter 的代码 #pragma warning restore SYSLIB0011
运行时行为变化
EnableUnsafeBinaryFormatterSerialization 属性的行为在不同项目类型中有差异:
| 项目类型 | 设置为 true | 设置为 false | 未设置 | |---------|------------|-------------|-------| | 类库 | 编译警告 | 编译错误 | 同 false | | Blazor/MAUI | 运行时失败 | 运行时失败 | 运行时失败 | | ASP.NET | 允许运行时调用 | 禁止运行时调用 | 同 false | | 桌面应用等 | 允许运行时调用 | 禁止运行时调用 | 编译错误但允许运行时调用 |
技术深度解析
这一变更反映了 .NET 团队对安全性的持续关注。BinaryFormatter 的设计允许在反序列化过程中执行任意代码,这使其成为潜在的安全威胁。现代序列化方案如 System.Text.Json 通过以下方式解决了这些问题:
- 显式类型控制:需要明确指定可反序列化的类型
- 不可执行代码:反序列化过程不会导致代码执行
- 更好的版本控制:明确处理类型演化问题
未来展望
根据微软的长期计划,BinaryFormatter 可能会在未来的 .NET 版本中被完全移除。新引入的类型如 Half 和 DateOnly 已经明确不支持 BinaryFormatter 序列化。
结论
.NET 7 中对 BinaryFormatter 的强化限制是 .NET 安全演进的重要一步。开发者应当:
- 评估现有代码中对
BinaryFormatter的依赖 - 制定迁移计划,优先考虑现代序列化方案
- 对于必须保留的用例,确保正确配置项目并了解运行时限制
通过这一变更,.NET 生态系统正在向更安全、更可靠的方向发展,为开发者提供更好的基础架构支持。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



