.NET Core 技术解析:BinaryFormatter 序列化方法已过时并在 ASP.NET 应用中禁用
背景介绍
在 .NET 生态系统中,BinaryFormatter 长期以来被用作二进制序列化和反序列化的工具。然而,随着技术的发展和安全意识的提高,微软在 .NET 5 中做出了一个重要决定:将 BinaryFormatter 相关方法标记为过时(obsolete),并在 ASP.NET 应用中默认禁用其功能。
变更内容
主要变更点
-
过时警告:
BinaryFormatter、Formatter和IFormatter的Serialize和Deserialize方法现在会产生编译警告SYSLIB0011。 -
ASP.NET 应用限制:在 ASP.NET Core 5.0 及更高版本的应用中,这些方法会抛出
NotSupportedException,除非显式重新启用BinaryFormatter功能。 -
.NET 7 升级:在 .NET 7 中,这些 API 的过时级别从警告升级为错误,意味着代码将无法编译通过。
变更原因
这一变更主要基于以下安全考虑:
-
安全问题:
BinaryFormatter存在已知的安全隐患,可能导致未授权的操作或系统不稳定。 -
不可信数据风险:当处理来自不受信任源的序列化数据时,
BinaryFormatter可能导致严重的安全问题。 -
生态系统健康:逐步淘汰不安全的组件有助于提高整个 .NET 生态系统的安全性。
影响范围
受影响的 API 包括:
BinaryFormatter.SerializeBinaryFormatter.DeserializeFormatter.SerializeFormatter.DeserializeIFormatter.SerializeIFormatter.Deserialize
迁移建议
推荐替代方案
- JSON 序列化:使用
System.Text.Json.JsonSerializer,这是 .NET 中高性能的 JSON 序列化方案。
// 使用 System.Text.Json 替代 BinaryFormatter
var jsonString = JsonSerializer.Serialize(myObject);
var deserializedObject = JsonSerializer.Deserialize<MyType>(jsonString);
- XML 序列化:使用
System.Xml.Serialization.XmlSerializer,适合需要 XML 格式的场景。
// 使用 XmlSerializer 替代 BinaryFormatter
var serializer = new XmlSerializer(typeof(MyType));
using var writer = new StringWriter();
serializer.Serialize(writer, myObject);
var xmlString = writer.ToString();
临时解决方案
如果必须暂时使用 BinaryFormatter,可以通过以下方式处理警告:
- 局部禁用警告:
#pragma warning disable SYSLIB0011
var formatter = new BinaryFormatter();
var result = (MyType)formatter.Deserialize(stream);
#pragma warning restore SYSLIB0011
- 项目全局禁用警告(不推荐):
<PropertyGroup>
<NoWarn>$(NoWarn);SYSLIB0011</NoWarn>
</PropertyGroup>
ASP.NET 应用的特殊处理
如果必须在 ASP.NET 应用中使用 BinaryFormatter,需要在项目文件中显式启用:
<PropertyGroup>
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>
注意:强烈不建议在生产环境中这样做,除非完全理解并接受潜在的安全风险。
安全建议
-
全面评估风险:在使用任何序列化方案前,评估数据来源的可信度。
-
最小权限原则:确保反序列化代码运行在最小必要权限下。
-
输入验证:对所有反序列化的数据进行严格验证。
-
日志监控:记录和监控序列化/反序列化操作,便于安全审计。
总结
随着 .NET 生态系统的发展,安全性和可靠性变得越来越重要。BinaryFormatter 的逐步淘汰是这一趋势的体现。开发者应当尽快迁移到更安全的替代方案,如 System.Text.Json 或 XmlSerializer,以确保应用的安全性和未来兼容性。
对于必须暂时使用 BinaryFormatter 的场景,务必充分了解风险并采取适当的安全措施。长期来看,迁移到更现代的序列化方案是确保应用安全的最佳选择。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



