2010-08-23 35 views
6

我有一个C#类,它是序列化到硬盘由BinaryFormatter,像这样的例子:如何重构在.NET中序列化的类?

// 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

回答

5

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

一个BinaryFormatter的可以使用代理人

  1. 提供序列化不是原先设计为序列化类型的能力。
  2. 提供了将一个类型的版本映射到另一个类型的另一个版本的方法。

人们也可以从类型A映射反序列化使用SerializationBinder到类型B(不同的类名称,命名空间和/或组件的名称)。

据我所知,这使得重构序列化的类并保持向后兼容性成为可能,从而在破坏单独版本控制不支持的变更时保持向后兼容性。

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

编辑:在一个侧面说明,重构字段(名称或类型)仍然是一个疼痛,如在Renaming fields then deserializing in C#讨论。我目前正在研究protobuf-net,以便将来更好地解决此问题。

1

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

+0

所以你的意思人应该实现ISerializable和GetObjectData()?如果反序列化程序具有不同的名称,名称空间和/或程序集,那么解序列化程序如何知道应该使用这个确切的Person类?我能否以某种方式告诉反序列化器使用哪个类? – angularsen 2010-08-23 10:17:36