2011-06-04 41 views
1

我想知道什麼會實際上改變一個類,從這個意義上說,這個類的序列化對象將不再被識別。修改共享方法會改變引用它們的類嗎?

如果該類有引用另一個類的共享方法。改變這種共享方法是否也會改變引用它們的類?

那麼如何將擴展方法更改爲自定義類,將會影響類「簽名」,如果這是合適的術語?

+1

很難理解你在這裏問的到底是什麼。如何使用簡短的代碼示例顯示您正在考慮的內容。 – 2011-06-04 14:33:32

+0

我不能在代碼中舉例說明。這只是關於類定義的一個問題。如果我改變一個類,這個類在變化之前被序列化的對象可能會產生一個異常,如果我嘗試使用新的/改變的類加載/讀取它們到程序構建中。我只是問什麼類型的更改會導致這種異常。任何改變?僅更改屬性和字段?方法的改變,引用其他類的靜態方法?擴展模塊?其中哪些會改變類的定義,哪些不會呢? – bretddog 2011-06-04 14:42:59

+1

擴展方法的改變根本不應該影響類,因爲這些擴展方法不是類接口的一部分。它們只是語法糖,使它們看起來像是班級的一部分。 – 2011-06-04 14:52:50

回答

1

對此的一個很好的參考是在MSDN上的Version Tolerant Serialization。總之,變爲共享的(靜態的C#)方法不會影響物體的反序列化:

  • 從不刪除串行化的字段。

  • 如果該屬性未應用於先前版本的字段,請不要將NonSerializedAttribute屬性應用於字段。

  • 切勿更改序列化字段的名稱或類型。

  • 添加新的序列化字段時,應用OptionalFieldAttribute屬性。

  • 從字段(在先前版本中不可序列化)中刪除NonSerializedAttribute屬性時,應用OptionalFieldAttribute屬性。

  • 對於所有可選字段,使用序列化回調來設置有意義的默認值,除非0或nullas默認值是可接受的。

作爲未成年人一邊:變化與序列化可能會影響反序列化一些特殊的方法。但是你會有意識地改變這些。

+0

謝謝!我甚至沒有意識到這些屬性的存在,所以我會詳細閱讀。 – bretddog 2011-06-04 15:23:49

1

數據發生更改時,序列化對象發生更改。對方法的引用永遠不會被序列化;它們是代碼的一部分,而不是數據。

+0

我想這不完全是我問的。我在問什麼類型的代碼更改爲我的類將使先前的序列化對象不被當前程序構建識別。我試圖瞭解如何編寫我的類,以避免需要在歸檔數據上運行自定義更新代碼。 – bretddog 2011-06-04 14:11:13

1

如果您正在執行二進制序列化,更改序列化類的私有屬性和公共屬性將「破壞接口」。如果您在使用XML或JSON,更改公共屬性將改變其序列化的方式。方法不會被序列化,所以你可以改變它們,它仍然可以工作(只要你不改變簽名)。