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

ang*_*sen 7 .net versioning refactoring serialization 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;
}
Run Code Online (Sandbox Code Playgroud)

稍后,我想通过以下一个或多个来重构此类
- 更改其名称
- 更改其命名空间
- 移动到另一个程序集

据我所知,只有具有完全相同名称,命名空间和程序集名称的类可用时,才能对二进制文件进行反序列化.

我该如何解决这个问题?
是否可以将反序列化映射到不同的类名,命名空间和程序集,而不会破坏版本容错序列化

ang*_*sen 5

经过一些研究,我意识到BinaryFormatter确实支持我想要的一切.

一个BinaryFormatter的可以使用替代品

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

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

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

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

编辑:在旁注中,重构字段(名称或类型)仍然很痛苦,如重命名字段中所讨论的,然后在C#中反序列化.我目前正在研究protobuf-net以便将来更好地解决这个问题.