不使用[Serializable]时[NonSerialized]的好处

时间:2010-09-17 13:56:12

标签: c# serialization nonserializedattribute

我正在查看我正在处理的项目中的一些现有代码,我找到了一个实现为的类:

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;
}

或者,即使类本身不是可序列化的,添加[NonSerialized]还有一些额外的好处吗?

5 个答案:

答案 0 :(得分:14)

  

或者,即使类本身不是可序列化的,添加[NonSerialized]还有一些额外的好处吗?

该类未密封,因此另一个类可以从该对象继承。该类可以标记为Serializable,然后NotSerializable属性将起作用。 (虽然没有指出私人会员)。

请记住,您也可以通过反射检查属性。运行时可能不会使用它来检查应该和不应该序列化的内容,它可以用作程序中其他东西的标记来处理某种自定义序列化(我不是说这是个好主意)至少)。

答案 1 :(得分:8)

当不使用Serializable时,NonSerialized将不起作用。默认情况下,类及其成员是不可序列化的。

当类未被序列化时声明NonSerialized的唯一优点是在类被Serialized对象继承的情况下,然后继承的成员将是不可序列化的。

来自MSDN

  

'NonSerialized'属性不会   影响这个成员,因为它   包含类不公开为   '序列化'。

     

默认情况下,类及其成员是不可序列化的。仅当序列化类的成员不应序列化时,才需要NonSerializedAttribute属性。

答案 2 :(得分:5)

我可以想到两个原因:

  1. 该字段未序列化至关重要。因此,如果将来该类具有可序列性,则不会引入错误,低效或安全问题,因为如果没有它标记类serialisable也将为该字段执行此操作。

  2. 他们可能会对属性进行某种自定义使用

  3. 在案例2中,从代码的其他地方可以清楚地知道这是正在发生的事情。不过,1号是很好的做法。

    案例1是一个很好的做法,值得平衡YAGNI(“你不会需要它” - 不做以后需要的工作“,考虑”好吧,但如果我以后需要,如果有人想念这个领域是一个例外,这将是一场灾难。

    所以,虽然它在这里没有效果,但对于开始产生影响的场景来说绝对是一个很好的做法。

    编辑:另一种可能性是它从以前的版本中可以看出它确实是可序列化的,或者当时作者有两种想法并且从未完全“完成”(工作代码是否完全完成了?)。仅仅因为某些东西在代码中,并不意味着它就是那种方式。尽管如此,如果某些事情没有被序列化是非常重要的,我仍然说这是出于上述原因标记这一点的好习惯。

答案 3 :(得分:4)

MSDN SerializeAttribute声明“将SerializableAttribute属性应用于类型以指示此类型的实例可以序列化。”这意味着没有它,该类无法序列化。我相信我已经尝试了这个,如果在NonSerializable类型上尝试序列化将抛出异常。

答案 4 :(得分:2)

我同意Greg一样,MSDN以类似的方式陈述它,引用引用是个好主意。

“默认情况下,类及其成员是不可序列化的。仅当序列化类的成员不应序列化时,才需要NonSerializedAttribute属性。”

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