2010-08-23 29 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