.NET Core 技术解析:BinaryFormatter 序列化 API 在 .NET 7 中的重大变更

.NET Core 技术解析:BinaryFormatter 序列化 API 在 .NET 7 中的重大变更

前言

在 .NET 生态系统中,BinaryFormatter 长期以来一直是序列化和反序列化对象的重要工具。然而,随着技术的发展和安全意识的提高,微软正在逐步淘汰这一组件。本文将深入解析 .NET 7 中关于 BinaryFormatter 的重大变更,帮助开发者理解这一变化并做好迁移准备。

BinaryFormatter 的问题背景

BinaryFormatter 存在几个关键问题:

  1. 安全风险:它允许执行任意代码,可能成为攻击载体
  2. 可靠性问题:类型保真度可能导致版本兼容性问题
  3. 性能问题:相比现代序列化方案效率较低

基于这些原因,微软从 .NET 5 开始就逐步淘汰 BinaryFormatter,并在 .NET 7 中进一步强化了这一策略。

.NET 7 中的变更详情

从警告升级为错误

在 .NET 7 中,以下 API 的调用将产生编译时错误(错误代码 SYSLIB0011):

  • Exception.SerializeObjectState 事件
  • BinaryFormatter.SerializeBinaryFormatter.Deserialize 方法
  • FormatterIFormatter 接口的序列化/反序列化方法

受影响的项目类型

这一变更会影响所有满足以下条件的项目:

  • C# 或 Visual Basic 项目
  • 目标框架为 net7.0 或更高版本
  • 直接调用上述受影响的 API
  • 未主动抑制 SYSLIB0011 警告

迁移建议

最佳实践:完全迁移

微软强烈建议开发者迁移到更现代的序列化方案,如:

  • System.Text.Json:高性能、低内存占用的 JSON 序列化器
  • XmlSerializer:XML 格式的序列化方案
  • Protobuf:Google 的高效二进制协议

临时解决方案

如果必须暂时保留 BinaryFormatter 的使用,可以通过以下方式处理:

  1. 项目文件配置

    <PropertyGroup>
        <EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
    </PropertyGroup>
    

    这将把错误降级为警告(与 .NET 5/6 行为一致)

  2. 代码中抑制警告

    #pragma warning disable SYSLIB0011
    // 使用 BinaryFormatter 的代码
    #pragma warning restore SYSLIB0011
    

运行时行为变化

EnableUnsafeBinaryFormatterSerialization 属性的行为在不同项目类型中有差异:

| 项目类型 | 设置为 true | 设置为 false | 未设置 | |---------|------------|-------------|-------| | 类库 | 编译警告 | 编译错误 | 同 false | | Blazor/MAUI | 运行时失败 | 运行时失败 | 运行时失败 | | ASP.NET | 允许运行时调用 | 禁止运行时调用 | 同 false | | 桌面应用等 | 允许运行时调用 | 禁止运行时调用 | 编译错误但允许运行时调用 |

技术深度解析

这一变更反映了 .NET 团队对安全性的持续关注。BinaryFormatter 的设计允许在反序列化过程中执行任意代码,这使其成为潜在的安全威胁。现代序列化方案如 System.Text.Json 通过以下方式解决了这些问题:

  1. 显式类型控制:需要明确指定可反序列化的类型
  2. 不可执行代码:反序列化过程不会导致代码执行
  3. 更好的版本控制:明确处理类型演化问题

未来展望

根据微软的长期计划,BinaryFormatter 可能会在未来的 .NET 版本中被完全移除。新引入的类型如 HalfDateOnly 已经明确不支持 BinaryFormatter 序列化。

结论

.NET 7 中对 BinaryFormatter 的强化限制是 .NET 安全演进的重要一步。开发者应当:

  1. 评估现有代码中对 BinaryFormatter 的依赖
  2. 制定迁移计划,优先考虑现代序列化方案
  3. 对于必须保留的用例,确保正确配置项目并了解运行时限制

通过这一变更,.NET 生态系统正在向更安全、更可靠的方向发展,为开发者提供更好的基础架构支持。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值