C# 避免使用类don';不支持序列化

C# 避免使用类don';不支持序列化,c#,serialization,C#,Serialization,各位: 我查看了一种避免使用不支持序列化的类的方法。但我不知道使用这种方法的原因。所以我在这里提出了这个问题 所以前面的代码如下所示 [Serializable] Class OutterClass { public UsingClass UsingClassMember { get; set; } } 因此,在这里,如果我想序列化OutterClass,它将发生异常

各位:

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

所以前面的代码如下所示

    [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 };
        }
    }
我不知道这次修改的原因。似乎使用ClassMember序列化的属性不需要使用class本身序列化类。谁能给我解释一下吗


谢谢

您必须决定是否要使用classmember在
中序列化数据

如果要序列化它,可以将
UsingClass
标记为
[Serializable]
。稍后反序列化数据时,您将获得与序列化之前相同的此属性的值

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


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

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

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

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

因此,您不能在C#auto属性上设置“NonSerialized”,但如果该属性具有烘焙字段(如第二个示例所示),则可以像您所做的那样进行设置。那么属性和字段都不会序列化

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


如果要序列化,则必须使用class
上设置
Serializable
属性,但如果不需要序列化,则可以作为第二种方法,或者在自动属性上使用
[XmlIgnoreAttribute]
BinaryFormatter和SoapFormatter仅序列化字段,而不是属性。在第一个示例中,自动实现属性生成一个不可序列化的隐藏字段。序列化程序看到此自动生成的不可序列化字段并引发异常


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

因此,@Matthew,我添加了非序列化属性,它将使用ClassMember管理m_。作为代码,非序列化属性是否也使用ClassMember管理属性?