2009-06-02 95 views
6

我有數據存儲在一個類的實例已被序列化.net BinaryFormatter。我現在想要重命名類中的某個字段,但仍然能夠反序列化舊數據。重命名字段,然後反序列化在C#中

一個選項是手動實現ISerializable並反序列化類的所有字段。但是,這看起來像很多工作,特別是如果我的課有很多領域,我只重新命名了一個領域。

有沒有更好的方法?


Craig建議保留舊類的反序列化副本,並將值複製到新類中。我在其他地方也看到了這一點 - 這對於實現ISerializable有什麼優勢?據我所見,複製這個類給我留下了兩個幾乎完全相同的類的副本,並且我仍然必須將所有舊類的值複製到新類中 - 這看起來與實現ISerializable具有相同的工作量幾乎重複類混入。


兩個答案都提到了Binders。我已經成功地使用SerializationBinder來反序列化一個被序列化爲類Foo的類Bar,但那是因爲類的名稱改變了。當你重命名一個字段時,SerializationBinder是否也有幫助 - 例如,當int m_Left被重命名爲int m_Right時?

+0

在Binder的BindToType方法中,當您獲得帶有目標類型(類)的typeName字符串時,只需返回更改屬性的新類型即可。類已經改變了屬性,但現在是不同的類型。沒有辦法只適用於一個物業。 – 2009-06-02 23:23:14

回答

2

你可以嘗試讓老過去的唯一目的是補液,然後只需複製你需要的字段到新的類。仍然有點痛苦,但應該工作。

1

是的,這是現場串行器的問題。您可以使用自定義Binder或「序列化代理」來避免實施ISerializable,但這只是個案修復。

我已經討論了這個主題(在混淆器和自動道具的背景下)here。我的建議是:不要使用BinaryFormatter的版本之間的數據......爲的持久性,看看基於合同的串行:

  • XmlSerializer
  • DataContractSerializer
  • 或二進制,像protobuf-net

這些都不能幫助您今天,但它可能會幫助您在將來設計它。

0

如果您只是將該屬性的訪問修飾符更改爲私有屬性,然後擁有基本上包裝舊屬性的新名稱的公共屬性會怎樣。這樣,你仍然應該能夠反序列化(我想),但使用這個類的人不會知道舊名稱。只是一個想法...

+0

這將工作,如果序列化作用於屬性,但據我所知,它直接與私人領域工作......(如果我在記事本中打開文件,我看到像m_Foo和m_Bar字段名稱,而是屬性名稱如Foo和Bar ... – 2009-06-03 08:47:10