我正在研究正在从事的项目中的一些现有代码,我发现一类实施为:

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

还是即使班级本身不可序列化,添加[非序列化]是否有其他好处?

有帮助吗?

解决方案

当不使用序列化时,非序列化将无效。默认情况下,班级及其成员是不可分割的。

在类未序列化时宣布非序列化的内容的唯一优势在于类是由序列化对象继承的情况下,然后继承的成员将是不可序列化的。

MSDN:

“非序列化”属性不会影响该成员,因为其包含类的属性不会被暴露为“可序列化”。

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

其他提示

还是即使班级本身不可序列化,添加[非序列化]是否有其他好处?

该类未密封,因此另一类可以从该对象继承。该类可以被标记为可序列化的,然后可以发挥不可思议的属性。 (尽管不是针对私人成员指出的)。

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

我可以想到两个原因:

  1. 该领域未序列化可能至关重要。因此,如果将来该类可以序列化,这将不会引入错误,效率低下或安全问题,因为如果不标记该类可串行的类别,也将为该领域做到这一点。

  2. 他们可能正在做某种属性的自定义使用

在情况2中,从代码中的其他地方可以清楚地看出,这就是正在发生的事情。 1号是好的练习。

案例1是一个好习惯,值得平衡Yagni(“您不需要它” - 如果以后需要它,则不需要工作”),考虑到“还可以”,但是如果我以后需要它,它将如果有人错过此领域是一个例外,请成为一场灾难。

因此,尽管这里没有效果,但对于开始产生效果的场景绝对是一个好习惯。

编辑:另一种可能性是,它是从以前的版本中推出的,该版本确实可以序列化,或者作者当时在两个想法中,并且从来没有完全“完成”(工作代码曾经完全完成?)。仅仅因为代码中的某些东西并不意味着那是那样的。尽管如此,如果没有序列化的东西确实很重要,我仍然说出于上述原因,标记这一点是很好的做法。

MSDN序列化图 指出“将SerializableAbeatTribute属性应用于一种类型,以表明可以序列化此类型的实例。”这意味着没有它,该类将无法序列化。我相信我已经尝试过这一点,如果尝试使用不可挑选的类型,序列化将引发异常。

我同意格雷格(Greg)的观点,MSDN以类似的方式指出,引用参考是一个好主意。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top