我正在查看我正在处理的项目中的一些现有代码,我找到了一个实现为的类:
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]还有一些额外的好处吗?
答案 0 :(得分:14)
或者,即使类本身不是可序列化的,添加[NonSerialized]还有一些额外的好处吗?
该类未密封,因此另一个类可以从该对象继承。该类可以标记为Serializable,然后NotSerializable属性将起作用。 (虽然没有指出私人会员)。
请记住,您也可以通过反射检查属性。运行时可能不会使用它来检查应该和不应该序列化的内容,它可以用作程序中其他东西的标记来处理某种自定义序列化(我不是说这是个好主意)至少)。
答案 1 :(得分:8)
当不使用Serializable时,NonSerialized将不起作用。默认情况下,类及其成员是不可序列化的。
当类未被序列化时声明NonSerialized的唯一优点是在类被Serialized对象继承的情况下,然后继承的成员将是不可序列化的。
来自MSDN:
'NonSerialized'属性不会 影响这个成员,因为它 包含类不公开为 '序列化'。
默认情况下,类及其成员是不可序列化的。仅当序列化类的成员不应序列化时,才需要NonSerializedAttribute属性。
答案 2 :(得分:5)
我可以想到两个原因:
该字段未序列化至关重要。因此,如果将来该类具有可序列性,则不会引入错误,低效或安全问题,因为如果没有它标记类serialisable也将为该字段执行此操作。
他们可能会对属性进行某种自定义使用
在案例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