3

每个人:

我查看了一种避免某些使用类不支持可序列化的方法。但我不知道使用这种方法的原因。所以我在这里提出了这个问题。

所以前面的代码喜欢下面

    [Serializable]
    Class OutterClass
    {
        public UsingClass UsingClassMember
        {
            get;
            set;
        }
    }

所以这里如果我想序列化OutterClass,会出现异常,因为UsingClass不支持序列化。显然,如果我想序列化 OutterClass,那么 OutterClass 中的所有成员都应该支持序列化。

但是,如果我将代码修改如下。序列化操作可以成功完成。

    [Serializable]
    Class OutterClass
    {
        [NonSerialized]
        private UsingClass m_UsingClassMember;
        public UsingClass UsingClassMember
        {
            get { return m_UsingClassMember; };
            set { m_UsingClassMember = value };
        }
    }

我不知道这种修改的原因。似乎UsingClassMember属性的序列化不需要序列化类UsingClass本身。谁能给我一个解释?

谢谢!

4

4 回答 4

1

您必须决定是否要序列化数据UsingClassMember

如果你想序列化它,你UsingClass[Serializable]. 稍后在反序列化您的数据时,您将获得此属性的值,就像它在序列化之前一样。

如果您不想序列化它,则用 标记相应的字段[NonSerialized]。在这种情况下,反序列化后该属性将为空(除非使用自定义反序列化)。

只有您可以根据您的属性的含义和用例中序列化的目的来决定选择哪种方法。

于 2013-07-18T02:53:26.087 回答
1

BinaryFormatter 和 SoapFormatter只序列化字段,而不是属性。在您的第一个示例中,自动实现的属性会生成一个不可序列化的隐藏字段。序列化程序看到这个自动生成的不可序列化字段并引发异常。

在您的第二个示例中,您将该字段标记为 NonSerialized 并且序列化程序会忽略该字段并可以序列化您的外部类。

于 2013-07-18T03:37:58.390 回答
1

您有很好的例子来说明如何防止 C# 自动属性序列化。

属性“NonSerialized”在此声明类型上无效。它仅对“字段”声明有效。

所以你不能在 C# 自动属性上设置“NonSerialized”,但如果属性像你的第二个例子一样带有烘焙字段,你可以像你一样设置它。那么属性和字段都不会序列化。

在第二种情况下,编译器将忽略该属性,因为下划线字段是非序列化的,并且不会像第一种情况那样出现异常。

如果你想序列化,那么你必须设置Serializable属性,UsingClass但如果你不需要序列化,你可以作为第二种方法或使用[XmlIgnoreAttribute]你的自动属性

于 2013-07-18T03:14:40.763 回答
0

当您序列化/反序列化包含该NonSerialized属性的内容时,不会考虑具有该属性的对象。当您反序列化它时, 的值UsingClassMember将是null(或您的数据类型的默认值)

于 2013-07-18T02:53:49.623 回答