重命名字段,然后在C#中反序列化

我将数据存储在已使用.net BinaryFormatter序列化的类的实例中。 我现在想要重命名该类中的一个字段,但仍然能够反序列化旧数据。

一种选择是手动实现ISerializable并反序列化该类的所有字段。 但这似乎很多工作,特别是如果我的class级有很多字段而且我只重命名了一个字段。

有没有更好的办法?


Craig建议保留旧类的副本以进行反序列化,并将值复制到新类。 我在其他地方也看到了这个建议 – 这对实现ISerializable有什么好处? 据我所知,复制该类会给我留下2个几乎相同的类副本,而且我仍然需要将旧类中的所有值复制到新类中 – 这似乎与使用ISerializable实现ISerializable相同。几乎重复的类投入混合。


两个答案提到了宾德斯。 我已成功使用SerializationBinder反序列化一个类序列为Bar Foo类,但这是因为类的名称已更改。 当你重命名一个字段时,SerializationBinder是否也有帮助 – 例如当int m_Left被重命名为int m_Right时?

您可以尝试将旧的calss挂起,仅用于补液,然后只需将您需要的字段复制到新类中。 仍然有点痛苦,但应该工作。

是的,这是基于字段的序列化程序的问题。 您可以使用自定义Binder或“序列化代理”来避免实现ISerializable ,但这只是一个案例修复。

我在这里讨论了这个主题(在混淆器和自动道具的背景下)。 我的建议是:不要使用BinaryFormatter来保持版本之间的数据…为此,请查看基于合同的序列化程序:

  • XmlSerializer
  • DataContractSerializer
  • 或者对于二进制,像protobuf-net这样的东西

这些对今天没有任何帮助,但它可能会帮助您在将来设计它。

之前我使用过SerializationBinder类

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationbinder.aspx

它可以用于反序列化,因此您可以将旧类型重新映射到新类型。

如果您只是将该属性上的访问修饰符更改为private,然后使用具有新名称的公共属性(基本上包装旧属性),该怎么办? 这样你仍然可以反序列化(我认为),但使用这个类的任何人都不会知道旧名称。 只是一个想法…