簡體   English   中英

不使用[Serializable]時[NonSerialized]的好處

[英]Benefits of [NonSerialized] when [Serializable] is not used

我正在查看我正在處理的項目中的一些現有代碼,我找到了一個實現為:

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]還有一些額外的好處嗎?

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

該類未密封,因此另一個類可以從該對象繼承。 該類可以標記為Serializable,然后NotSerializable屬性將起作用。 (雖然沒有指出私人會員)。

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

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

當類未被序列化時聲明NonSerialized的唯一優點是在類被Serialized對象繼承的情況下,然后繼承的成員將是不可序列化的。

來自MSDN

'NonSerialized'屬性不會影響此成員,因為其包含的類未公開為'Serializable'。

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

我可以想到兩個原因:

  1. 該領域不是序列化的至關重要。 因此,如果將來該類具有可序列性,則不會引入錯誤,低效或安全問題,因為如果沒有它標記類serialisable也將為該字段執行此操作。

  2. 他們可以對屬性進行某種自定義使用

在案例2中,從代碼的其他地方可以清楚地看到這就是正在發生的事情。 但是,1號是很好的做法。

案例1是一個很好的做法,值得平衡YAGNI(“你不會需要它” - 不做工作“以防以后需要”)考慮“好吧,但如果我以后需要它,它會'如果有人錯過了這個字段是一個例外,那將是一場災難。

因此,雖然它在這里沒有任何影響,但對於開始產生影響的場景來說絕對是一個很好的做法。

編輯:另一種可能性是,它是從以前的版本,它確實是可序列化的或者作者當時有兩個想法並且從未完全“完成”(工作代碼是否完全完成?)。 僅僅因為某些東西在代碼中,並不意味着它就是那種方式。 盡管如此,如果某些事情沒有被序列化是非常重要的,我仍然說這是出於上述原因而標記這一點的好習慣。

MSDN SerializeAttribute聲明“將SerializableAttribute屬性應用於某個類型以指示此類型的實例可以序列化。”這意味着沒有它,該類無法序列化。 我相信我已經嘗試過這個,如果嘗試在NonSerializable類型上,序列化將拋出異常。

我同意Greg,MSDN以類似的方式說明它,引用引用是個好主意。

“默認情況下,類及其成員是不可序列化的。僅當序列化類的成員不應序列化時,才需要NonSerializedAttribute屬性。”

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM