为何.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
相关产品推荐
相关产品推荐

