You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何.NET Framework4.8序列化的BinaryFormatter对象无法在.NET6反序列化?

.NET 4.8与.NET 6之间BinaryFormatter跨版本反序列化兼容性问题

我正在把基于.NET Framework 4.8的旧应用适配到.NET 6,其中BinaryFormatter序列化、反序列化模型的逻辑未做修改,但碰到了跨版本兼容性问题:

  • .NET 4.8序列化的模型 → .NET 6反序列化:失败
  • .NET 6序列化的模型 → .NET 4.8反序列化:成功

抛出的异常为:
System.Runtime.Serialization.SerializationException: 'Invalid BinaryFormatter stream.'
内部异常是:
ArgumentException: Type '<my type>' is not deserializable.

我的反序列化绑定器里程序集名称和类型配置均正确,但搞不懂的是,如果问题出在应用程序集版本上,为什么.NET 6到4.8的反序列化能成功?

我查了些资料,只找到和.NET Core相关的问题,也知道微软文档里说明BinaryFormatter已废弃且存在安全问题,但目前全面切换成JSON/XML序列化并不现实。

有没有人清楚影响BinaryFormatter在新版.NET中向后兼容性的具体问题?

补充:最小复现示例

没法分享实际代码和类型,但发现System.Random也存在类似问题:

// .NET Framework 4.8 环境
FileStream fs = new FileStream("DataFile.dat", FileMode.Create);
try 
{
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(fs, new Random()); 
}
catch (SerializationException) { throw; }
finally { fs.Close(); }

FileStream fs2 = new FileStream("DataFile.dat", FileMode.Open);
try
{
    BinaryFormatter formatter2 = new BinaryFormatter();
    var randomObj = formatter2.Deserialize(fs2); // 反序列化成功
}
catch (SerializationException) { throw; }
finally { fs.Close(); }

// .NET 6.0 环境
FileStream fs = new FileStream("DataFile.dat", FileMode.Open);
try
{
    BinaryFormatter formatter = new BinaryFormatter();
    var randomObj = formatter.Deserialize(fs); // 反序列化失败
}
catch (SerializationException){ throw; }
finally { fs.Close(); }

内容的提问来源于stack exchange,提问作者ijk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:25:34