.NET 8 重大变更:BinaryFormatter 在大多数项目类型中被禁用

.NET 8 重大变更:BinaryFormatter 在大多数项目类型中被禁用

docs This repository contains .NET Documentation. docs 项目地址: https://gitcode.com/gh_mirrors/docs2/docs

引言

在 .NET 8 中,微软继续推进其安全改进计划,对 BinaryFormatter 进行了更严格的限制。本文将详细介绍这一变更的背景、影响范围以及开发者应采取的应对措施。

BinaryFormatter 简介

BinaryFormatter 是 .NET 中一个历史悠久的二进制序列化工具,它可以将对象图转换为二进制格式,并能够完整地重建原始对象。然而,这种强大的功能也带来了严重的安全隐患:

  1. 类型安全风险:反序列化时可以实例化任意类型
  2. 数据篡改风险:二进制数据容易被修改
  3. 版本兼容性问题:类型结构变更后难以处理

变更内容

旧行为(.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 应用

应对策略

推荐方案:迁移到替代方案

微软强烈建议开发者迁移到更安全的序列化方案,包括但不限于:

  1. System.Text.Json:高性能、低内存占用的 JSON 序列化器
  2. XmlSerializer:基于 XML 的序列化方案
  3. Protocol Buffers:Google 开发的高效二进制序列化格式
  4. MessagePack:快速紧凑的二进制序列化格式

这些替代方案都提供了更好的安全控制和性能特性。

临时解决方案:启用兼容性开关

如果必须继续使用 BinaryFormatter,可以通过修改项目文件添加兼容性开关:

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

但需要注意:

  1. 这只是一个临时解决方案
  2. 未来版本可能会完全移除该开关
  3. 仍需承担使用 BinaryFormatter 的安全风险

迁移建议

步骤一:识别使用场景

检查代码库中 BinaryFormatter 的使用场景,包括:

  • 持久化存储
  • 进程间通信
  • 网络传输
  • 缓存机制

步骤二:评估替代方案

根据使用场景选择合适的替代方案:

  • 配置存储:System.Text.Json
  • 高性能通信:Protocol Buffers
  • 兼容性要求:XmlSerializer

步骤三:逐步替换

建议采用渐进式替换策略:

  1. 在新代码中使用替代方案
  2. 逐步重构旧代码
  3. 实现双向兼容(如需要)

结论

.NET 8 对 BinaryFormatter 的限制是微软加强 .NET 平台安全性的重要举措。作为开发者,我们应该积极响应这一变更,评估现有代码库,并制定合理的迁移计划。虽然短期内可能需要投入一些重构工作,但从长远来看,采用更现代的序列化方案将带来更好的安全性、性能和可维护性。

docs This repository contains .NET Documentation. docs 项目地址: https://gitcode.com/gh_mirrors/docs2/docs

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余伊日Estra

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

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

抵扣说明:

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

余额充值