NonSerialized 属性创建错误

Posted

技术标签:

【中文标题】NonSerialized 属性创建错误【英文标题】:NonSerialized attribute creating error 【发布时间】:2011-07-25 09:26:35 【问题描述】:

我正在尝试序列化具有嵌套类的对象。我已经用 [NonSerialized] 属性标记了嵌套类,但我收到一个错误:

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

如何从序列化中省略嵌套类?

我已经包含了一些代码,可以显示我正在尝试做的事情。 感谢您的帮助。

[Serializable]
public class A_Class

    public String text  get; set; 

    public int number  get; set; 


[Serializable]
public class B_Class

    [NonSerialized]
    public A_Class A  get; set; 

    public int ID  get; set; 


public  byte[] ObjectToByteArray(object _Object)

    using (var stream = new MemoryStream())
    
        var formatter = new BinaryFormatter();
        formatter.Serialize(stream, _Object);
        return stream.ToArray();
    


void Main()

    Class_B obj = new Class_B()

    byte[] data = ObjectToByteArray(obj);

【问题讨论】:

该错误完全描述了问题 - 您不能将此属性应用于除字段之外的任何内容(您正在尝试将其应用于属性)。 【参考方案1】:

该错误告诉您您需要知道的一切:NonSerialized 只能应用于字段,但您正在尝试将其应用于属性,尽管是自动属性。

您唯一真正的选择是不使用该字段的自动属性,如 *** question 中所述。

【讨论】:

【参考方案2】:

还要考虑属性上的 XmlIgnore 属性:

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributes.xmlignore.aspx

IIRC,二进制序列化会自动忽略属性。

【讨论】:

【参考方案3】:

尝试显式使用您可以标记为 [NonSerialized] 的支持字段

[Serializable]
public class B_Class

  [NonSerialized]
  private A_Class a;  // backing field for your property, which can have the NonSerialized attribute.
  public int ID  get; set; 

  public A_Class A // property, which now doesn't need the NonSerialized attribute.
  
    get  return a;
    set  a= value; 
  

问题是NonSerialized 属性对字段有效,但对属性无效,因此您不能将它与自动实现的属性结合使用。

【讨论】:

以上是关于NonSerialized 属性创建错误的主要内容,如果未能解决你的问题,请参考以下文章

非财产化的财产

(多选题)关于C#中的特性,说法错误的是()。

Xml 序列化

SerializeField等Unity内的小用法

C# System.Serializable() 问题

.Net Attribute详解(上)-Attribute本质以及一个简单示例