6

我正在尝试序列化具有嵌套类的对象。我已使用 [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);
}
4

3 回答 3

11

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

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

于 2011-03-29T15:18:28.037 回答
10

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

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

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

于 2011-05-26T14:09:17.153 回答
7

尝试显式使用可以标记为 [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属性对字段有效,但对属性无效,因此您不能将其与自动实现的属性结合使用。

于 2011-03-29T15:21:08.620 回答