【问题标题】:BinaryFormatter serialized object from .NET Framework 4.8 won't deserialize in .NET 6来自 .NET Framework 4.8 的 BinaryFormatter 序列化对象不会在 .NET 6 中反序列化
【发布时间】: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


【解决方案1】:

使用 BinaryFormatter 进行对象的序列化和反序列化存在已知风险 - 特别是跨版本的框架。

请查看 link,它积极反对使用二进制格式化程序对使用二进制格式化程序的对象进行序列化/反序列化。

此外,从 .Net 5 开始,对 binaryformatter 的反序列化操作会引发 NotSupportedException 类型的异常。有关详细信息,请参阅此 link 上的异常标记。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    相关资源
    最近更新 更多