避免使用类don';t支持序列化

本文关键字:支持 序列化 don | 更新日期: 2023-09-27 18:23:36

每个人:

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

所以前面的代码喜欢下面的

    [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本身。有人能给我一个解释吗?

谢谢!

避免使用类don';t支持序列化

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

特性"NonSerialized"对此声明类型无效。是的仅对"field"声明有效。

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

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

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

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

如果要序列化它,可以用[Serializable]标记UsingClass。稍后在反序列化数据时,您将获得该属性的值,与序列化前一样。

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

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

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

在第二个示例中,将该字段标记为NonSerialized,序列化程序将忽略该字段,并可以序列化outter类。

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