優勢

2010-09-17 109 views
11

我期待通過在一個項目我工作的一些現有的代碼,我發現,作爲實現類:優勢

public class ThingOne 
{ 
    private int A; 

    private int B; 

    [NonSerialized] 
    private System.Timers.Timer timer1; 
} 

不該它看起來更像這樣嗎?

[Serializable] 
public class ThingOne 
{ 
    private int A; 

    private int B; 

    [NonSerialized] 
    private System.Timers.Timer timer1; 
} 

或者,即使類本身不是Serializable,添加[NonSerialized]還有一些額外的好處嗎?

+0

這是一個非常有趣的問題,在我研究之前,我只能對答案有一個模糊的想法。 – 2010-09-17 14:07:41

回答

8

未使用Serializable時,NonSerialized將不起作用。默認情況下,類和它們的成員是不可序列化的。

當類未被序列化時,聲明非事件化的唯一好處是該類被序列化對象繼承的情況下,然後繼承的成員將是不可序列化的。

MSDN

「非序列化」屬性不會 影響此構件,因爲它含有類 不暴露作爲 「序列化」。

默認情況下,類及其成員是不可序列化的。只有在序列化類的成員不應被序列化時,才需要NonSerializedAttribute屬性。

14

還是有要加入[非序列化]即使類本身無法序列化一些額外的好處?

該類不密封,所以另一個類可以從該對象繼承。那個類可以被標記爲Serializable,然後NotSerializable屬性會起作用。 (儘管正如私人成員所指出的那樣)。

請記住,您也可以通過反射來檢查屬性。運行時可能不會使用它來檢查應該不應該序列化的內容,它可以用作程序中處理某種自定義序列化的其他內容的標記(我並不是說這是一個好主意至少)。

+0

準確地說,我打算寫得更好:-)! – InSane 2010-09-17 14:02:56

+0

'timer1'是'private',那麼這隻適用於它是否受保護的情況? – FrustratedWithFormsDesigner 2010-09-17 14:04:27

+0

是的,看我關於反射的更新。 – kemiller2002 2010-09-17 14:05:37

2

我同意格雷格,MSDN指出它以類似的方式,參考文獻引證是一個好主意..

「默認情況下,類及其成員都是非序列化的。該NonSerializedAttribute屬性只需要如果序列化類的成員不應該被序列化。「

http://msdn.microsoft.com/en-us/library/dwys85sk(VS.80).aspx

+0

我在我的答案中引用了確切的參考。 – Greg 2010-09-17 14:03:37

+0

事後,很好的參考,[編輯]。 – 2010-09-17 14:05:54

4

MSDN SerializeAttribute指出,「應用SerializableAttribute屬性的類型,以表明該類型的實例可以被串行化。」這意味着,沒有它,類不能被序列化。我相信我已經嘗試過這一點,如果序列化嘗試在NonSerializable類型上,它將引發異常。

5

我能想到的原因有兩個:

  1. 這可能是至關重要的領域不是序列。因此,如果將來該類是可串行化的,這不會引入錯誤,低效或安全問題,因爲如果沒有它,標記類可串行化對於該字段也會這樣做。

  2. 他們可以做某種自定義的使用屬性

在案例2中的它會從代碼,這是發生了什麼事在其他地方明確。儘管如此,數字1是很好的做法

案例1是一個很好的實踐,它可以是值得平衡的YAGNI(「你不會需要它」 - 如果以後需要時不做工)「,但如果我確實需要它,這將是一個災難,如果有人錯過這個領域是個例外。

所以,雖然它在這裏沒有效果,那絕對是對場景一個很好的做法在那裏開始有效果。

編輯:另一種可能性是它從以前的版本中刪去,它確實是可序列化的,或者當時作者在兩個腦海中,它從來沒有完全「完成」(工作代碼是否完全完成?)。在代碼中,doesn這並不意味着它就是這樣。儘管如此,如果某件事沒有序列化是非常重要的,我仍然認爲這是一個很好的做法,因爲上面給出的理由。