2011-03-04 79 views
1

據我所知,當你用[serializable]註解一個類型時,它告訴CLR這個類型可以被序列化。當類型被註釋爲[serializable]時,CLR在「自動地」執行什麼?

我不喜歡這種看起來像「黑盒子」的魔術給我。我想知道它是什麼時,我用這個屬性標記它。

此外,當我真正嘗試序列化一個對象時,知道它會做什麼會是有幫助的。

P.S.如果這個問題的答案可以處理任何屬性,請隨時編輯我的問題標題和問題以反映這一點。謝謝。

+0

作爲.Net的完全支持的功能,屬性是附加到類的元數據,因此可以通過反射來發現。它們是標記界面的一個(可以說是)很好的選擇。他們通常只是簡單的類,可能會或可能不會保存數據。 http://msdn.microsoft.com/en-us/library/aa720537(v=vs.71).aspx – 2011-03-04 19:21:32

+0

這裏沒有任何意義的是,你必須將一個類標記爲[serializable]來使它如此。什麼是CLR,當你嘗試序列化一個對象時,它不能僅僅嘗試序列化?爲什麼它需要事先知道你要嘗試序列化一個類的實例? – richard 2011-03-04 19:43:27

回答

2

公共語言運行時(CLR)管理對象在內存中的佈局方式,.NET Framework通過使用反射提供自動化序列化機制。當對象序列化時,類的名稱,程序集以及類實例的所有數據成員都寫入存儲器。對象通常將對其他實例的引用存儲在成員變量中。當類被序列化時,序列化引擎會跟蹤已經序列化的所有引用對象,以確保同一對象不會被序列化多次。隨.NET Framework提供的序列化體系結構可以自動正確處理對象圖和循環引用。對象圖的唯一要求是被序列化的對象引用的所有對象也必須標記爲可序列化。如果沒有這樣做,串行器嘗試序列化未標記對象時將引發異常。

這篇文章的這一部分:http://msdn.microsoft.com/en-us/library/ms973893.aspx

+0

因此,直到你真的試圖序列化一個對象,唯一發生的事情是你得到_serializable_元數據?那是對的嗎? – richard 2011-03-04 19:04:45

+2

是的,這是正確的。 – 2011-03-04 19:07:51

1

出現這種情況是typeof(MyClass).IsSerializable將是現實的唯一因素。然後在執行實際序列化的代碼中有一個聲明if (!typeToBeSerialized.IsSerializable) throw ...

相關問題