【问题标题】:NonSerialized attribute creating errorNonSerialized 属性创建错误
【发布时间】: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);
}

【问题讨论】:

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

标签: c# .net serialization serializable


【解决方案1】:

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

您唯一真正的选择是不使用该字段的自动属性,如 StackOverflow 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 属性对字段有效,但对属性无效,因此您不能将它与自动实现的属性结合使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2017-05-25
        相关资源
        最近更新 更多