繁体   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