如何重构.NET中序列化的类?

时间:2010-08-23 07:37:41

标签: .net serialization refactoring versioning binaryformatter

我有一个由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

2 个答案:

答案 0 :(得分:5)

经过一番研究后,我意识到BinaryFormatter确实支持我所寻找的一切。

BinaryFormatter可以使用代理

  
      
  1. 提供序列化最初未设计为序列化的类型的功能。
  2.   
  3. 提供将一种类型的版本映射到另一种类型的另一种版本的方法。
  4.   

还可以使用 SerializationBinder 将反序列化从类型A映射到类型B(不同的类名,命名空间和/或程序集名称)。

据我所知,这可以重构序列化的类,并在进行单独版本控制不支持的重大更改时保持向后兼容性。

参考:http://www.diranieh.com/NETSerialization/BinarySerialization.htm

编辑:在旁注中,重构字段(名称或类型)仍然很痛苦,如Renaming fields then deserializing in C#中所述。我目前正在研究protobuf-net以便将来更好地解决这个问题。

答案 1 :(得分:1)

您可以实现ISerializable界面并覆盖GetObjectData以提供自己的反序列化。我没有尝试过,但您应该能够“手动”反序列化旧对象。