避免使用类不支持Serializable

时间:2013-07-18 02:46:25

标签: c# serialization

每个人:

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

所以前面的代码喜欢以下

    [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 个答案:

答案 0 :(得分:1)

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

如果要对其进行序列化,请使用UsingClass标记[Serializable]。稍后在反序列化数据时,您将获得此序列化之前的属性值。

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

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

答案 1 :(得分:1)

你有很好的例子来说明如何阻止C#auto属性的序列化。

  

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

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

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

如果您要序列化,则必须在Serializable上设置UsingClass属性,但如果您不需要序列化,则可以使用第二种方法或使用[XmlIgnoreAttribute]汽车财产

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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