优势

2010-09-17 114 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这并不意味着它就是这样。尽管如此,如果某件事没有序列化是非常重要的,我仍然认为这是一个很好的做法,因为上面给出的理由。