【发布时间】:2022-12-01 02:17:31
【问题描述】:
由于使用了新版本的 API,我正在将一个用 .NET Framework 4.8 编写的旧应用程序改编为 .NET 6。序列化和反序列化由 API 使用 BinaryFormatter 创建的模型的逻辑没有改变。但是,存在一个奇怪的交叉兼容性问题,如下所示:
- 模型在 .NET 4.8 中序列化 -> 模型在 .NET 6.0 中反序列化 - 失败
- 模型在 .NET 6.0 中序列化 -> 模型在 .NET 4.8 中反序列化 - 有效
异常是“System.Runtime.Serialization.SerializationException:'无效的 BinaryFormatter 流。'”,内部异常是“ArgumentException:类型'<我的类型>'不可反序列化。”
程序集名称和类型在我的反序列化联编程序中似乎是正确的,这是我能够深入了解此代码的程度。此外,我很困惑,如果我的应用程序的汇编版本是罪魁祸首,那么从 6.0 到 4.8 的成功。
我对这个问题的研究只提出了几个问题,例如这个 (https://github.com/dotnet/runtime/issues/35346),但涉及 .NET Core。我知道 BinaryFormatter 已被弃用并且根据 MS 文档存在安全问题,但目前将所有内容转换为使用 JSON/XML 并不是一个真正现实的解决方案。
有没有人知道影响 BinaryFormatter 在更现代的 .NET 版本中向后兼容的问题?
【问题讨论】:
-
请提供minimal reproducible example。 Stack Overflow 不是用来查询其他人是否有类似问题的:它是为了解释你的问题,然后那些了解该主题的人可以帮助找到解决方案。尽管您已经描述了您的问题,但 minimal reproducible example 将大大有助于其他人能够重现和试验以找到解决方案。
-
始终向后兼容不保证.微软的所有建议都说不要这样做。选择将其用于长期持久化数据是一颗定时炸弹,而且不仅仅是一颗定时炸弹,而是一颗定时炸弹一点也不秘密定时炸弹您必须编写一个 .NET 4.8 工具来读取它并将其转换为其他内容。
-
.NET6是.NETCore,因此 github 问题适用。您至少需要显示堆栈跟踪。
标签: c# .net deserialization backwards-compatibility binaryformatter