【问题标题】:Deserialize to newer version [duplicate]反序列化到较新的版本[重复]
【发布时间】:2013-04-11 16:27:38
【问题描述】:

我有一个从类序列化的二进制文件。 该类已更新。

现在我需要将旧文件反序列化为新类。

我无法访问旧代码,但我可以访问旧类。

类是使用 BinaryFormatter 序列化的。

有没有办法做到这一点?

如果没有,也许有办法反序列化并仅保存两个版本中出现的数据?

【问题讨论】:

  • 问题是什么?现在会发生什么? (什么例外等)。做了哪些改变?添加字段?删除?改名了?子类化?什么?另外:你怎么不能访问旧源?
  • 引用的话题讲的是另一个方向,但分辨率是一样的。
  • 关于版本化序列化的总体主题:是的……BinaryFormatter 在这方面并不出色……这是 protobuf-net 等工具存在的众多原因之一。
  • 同意 Marc - protobuf 是要走的路! (顺便说一句,评论+1)。

标签: c# .net serialization versioning versions


【解决方案1】:

如果您有旧程序集,您可以通过以下方式轻松升级:

  • 反序列化为旧类类型的对象
  • 编写一个映射器,将旧数据字段映射到新类中的字段
  • 序列化新类的对象

在映射器中,您可以转换旧数据、添加新数据等。

【讨论】:

  • 如何创建映射器?
  • Mapper 应该是一个类,它接受旧类的一个对象和一个新类(或创建一个新对象)并将所有值从旧类复制到新类的相应字段。
  • 我想过,但后来我意识到有一些私有和只读字段。以及一些在运行时自动生成并需要加载到新类中的字段
  • 那么它变得有点脏了。您可以使用反射来访问旧类中的私有字段。在运行时填充的字段应该不是问题,因为您实际上加载了旧对象。
  • #2:无论如何,您应该考虑一种数据结构,以避免这种缓慢、容易出错且总之在未来版本中很难维护反射解决方法。
猜你喜欢
  • 2011-10-09
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 2018-02-11
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多