【发布时间】:2009-06-02 22:58:23
【问题描述】:
我将数据存储在已使用 .net BinaryFormatter 序列化的类的实例中。我现在想重命名类中的一个字段,但仍然能够反序列化旧数据。
一种选择是实现 ISerializable 并手动反序列化类的所有字段。但这似乎需要做很多工作,尤其是如果我的班级有很多字段并且我只重命名了一个字段。
有没有更好的办法?
Craig 建议保留旧类的副本以进行反序列化,并将值复制到新类。我在其他地方也看到过这个建议——这比实现 ISerializable 有什么优势?据我所见,复制该类给我留下了该类的 2 个几乎相同的副本,而且我仍然必须将旧类中的所有值复制到新类中——这似乎与使用 ISerializable 实现相同的工作量几乎重复的类被扔进了混合中。
两个答案都提到了Binders。我已经成功地使用了 SerializationBinder 来反序列化一个被序列化为类 Foo 的类 Bar,但那是因为类的名称发生了变化。当您重命名字段时,SerializationBinder 是否也有帮助 - 比如当 int m_Left 已重命名为 int m_Right 时?
【问题讨论】:
-
在 Binder 的 BindToType 方法中,当您获得具有目标类型(类)的 typeName 字符串时,只需返回您更改属性的新类型。类只改变了属性,但现在是不同的类型。没有办法只适用于一个属性。
标签: c# serialization