《Effective C#》讀書筆記——條目27:讓類型支援序列化

來源:互聯網
上載者:User

  持久化(persistence)是類型的一個重要特性。只要我們的類型不是UI控制項、表單或者表單,都應該儘可能的為類型添加序列化支援。.NET的序列化是把類中所有成員變數儲存到輸出資料流中,同時.NET的序列化還支援任意的對象圖(object graph):即使你的對象上有一個循環參考,serialize 和deserialize 方法都只會為你的實際對象讀取和儲存一次。

 

1. .NET的序列化支援

  在.NET中支援序列化是一件非常簡單的任務,在絕大多數的情況下,只需要添加一個Serializable特性就可以了。但是這裡有一個前提:

使用Serializable特性對類進行序列化支援,要求該類的所有成員都是可序列化的。

 

例如,下面的例子,由於int和string類型都是支援.NET序列化,所有我們只需要簡單的添加Serializable特性即可。

1     [Serializable]2     public class MyType3     {4         private string lable;5         private int value;6     }

 

反之,如果在一個類中如果有成員不支援序列化,而又使用Serializable,例如下面的代碼中,由於OhterClass類沒有序列化支援,在序列化MyType時,會得到一個執行階段錯誤。

1 [Serializable]2 public class MyType3 {4     private string lable;5     private int value;6     private OtherClass other;7 }

 

2.正確的初始化使用NonSerialized特性的成員

  添加Serializable特性是支援對象序列化的最簡單方式,但最簡單的方式卻不一定總是這卻的方式。假如:我們並不想序列化對象的所有成員:比如某些成員可能只存在於與長期操作的緩衝中、或者佔用著一些運行時資源,而這些資源只存在於與記憶體中時我們該如何解決這一問題呢?同樣,我們可以通過添加NonSerialized特性到任何你不想讓它序列化的資料成員上:

1     [Serializable]2     public class MyClass3     {4         public int Id{get;set;}5         [NonSerialized]6         public int CachedValue{get;set;}7         public string Name{get;set;}8     }

 

  當我們使用NonSerialized特性時,我們同時也需要完成一些額外的工作:因為在還原序列化的過程中.NET序列化API不會初始化使用NonSerialized特性的成員,同時由於類型的建構函式不會被調用,所有成員的初始化器也就不會被執行。當使用Serializable特性時,那些使用NonSerialized特性的成員只會得到系統設定的預設值:0或null(實值型別或參考型別);如果系統預設的初始化行為並不是我們想要的效果,那麼著時候我們可以通過實現IDeserializationCallback介面來對這些成員進行初始化。在整個對象圖被還原序列化之後,.NET會自動調用該介面唯一的OnDeserialization()方法。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.