我有一个由BinaryFormatter序列化到磁盘的C#类,例如:
// Version 3.0
[Serializable]
public class Person
{
public string FullName;
[OptionalField(VersionAdded=2)]
public string NickName;
[OptionalField(VersionAdded=2)]
public DateTime BirthDate;
[OptionalField(VersionAdded=3)]
public int Weight;
}
后来,我想通过以下一个或多个来重构这个类
- 更改名称
- 更改其名称空间
- 移动到另一个程序集
据我所知,只有具有完全相同名称,命名空间和程序集名称的类可用时,才能对二进制文件进行反序列化。
我该如何解决这个问题? 是否可以将反序列化映射到不同的类名,命名空间和汇编而不会中断Version Tolerant Serialization?
答案 0 :(得分:5)
经过一番研究后,我意识到BinaryFormatter确实支持我所寻找的一切。
BinaryFormatter可以使用代理来
- 提供序列化最初未设计为序列化的类型的功能。
- 提供将一种类型的版本映射到另一种类型的另一种版本的方法。
醇>
还可以使用 SerializationBinder 将反序列化从类型A映射到类型B(不同的类名,命名空间和/或程序集名称)。
据我所知,这可以重构序列化的类,并在进行单独版本控制不支持的重大更改时保持向后兼容性。
参考:http://www.diranieh.com/NETSerialization/BinarySerialization.htm
编辑:在旁注中,重构字段(名称或类型)仍然很痛苦,如Renaming fields then deserializing in C#中所述。我目前正在研究protobuf-net以便将来更好地解决这个问题。
答案 1 :(得分:1)
您可以实现ISerializable
界面并覆盖GetObjectData
以提供自己的反序列化。我没有尝试过,但您应该能够“手动”反序列化旧对象。