我将数据存储在已使用.net BinaryFormatter序列化的类的实例中。我现在想要重命名该类中的一个字段,但仍然可以反序列化旧数据。
一种选择是手动实现ISerializable并反序列化该类的所有字段。但这似乎很多工作,特别是如果我的班级有很多字段而且我只重命名了一个字段。
有更好的方法吗?
Craig建议保留旧类的副本以进行反序列化,并将值复制到新类。我在其他地方也看到了这个建议 - 这比实现ISerializable有什么优势?据我所知,复制该类给我留下了两个几乎相同的类副本,而且我仍然需要将旧类中的所有值复制到新类 - 这似乎与实现ISerializable的工作量相同。几乎重复的类投入混合。
两个答案提到了宾德斯。我已经成功地使用SerializationBinder反序列化了一个被序列化为类Foo的类Bar,但那是因为类的名称发生了变化。当你重命名一个字段时,SerializationBinder是否也有帮助 - 例如当int m_Left被重命名为int m_Right时?
答案 0 :(得分:2)
您可以尝试将旧的calss挂起,仅用于补液,然后只需将您需要的字段复制到新类中。仍然有点痛苦,但应该工作。
答案 1 :(得分:2)
是的,这是基于字段的序列化程序的问题。您可以使用自定义Binder
或“序列化代理”来避免实现ISerializable
,但这只是个案修复。
我已经讨论过这个话题(在混淆器和自动道具的背景下)here。我的建议是:不要使用BinaryFormatter
来保持版本之间的数据...为此,请查看基于合同的序列化程序:
XmlSerializer
DataContractSerializer
这对今天没有任何帮助,但它可能有助于您将来设计它。
答案 2 :(得分:0)
我之前使用过SerializationBinder类
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationbinder.aspx
它可以用于反序列化,因此您可以将旧类型重新映射为新类型。
答案 3 :(得分:0)
如果您只是将该属性上的访问修饰符更改为private,然后使用具有新名称的公共属性(基本上包装旧属性),该怎么办?这样你仍然可以反序列化(我认为),但使用这个类的任何人都不会知道旧名称。只是一个想法...