Почему [NonSerialized] не работает с автоматически реализованными свойствами? - PullRequest
6 голосов
/ 21 сентября 2010
[Serializable]
class MyClass
{
    [NonSerialized] int Foo { get; set; } // error
    [NonSerialized] int bar; // ok
}

Почему это запрещено?

Я знаю об обходных путях, таких как

  • , реализующих переключение ISerializable
  • на XmlSerializer / XmlIgnore
  • переключение на реализуемое вручную свойство

В частности, вопрос , почему [NonSerialized] запрещен для свойств, но разрешен для полей.

Ответы [ 3 ]

12 голосов
/ 21 сентября 2010

Свойства на самом деле являются методами, они не сериализуются процессом двоичной сериализации.Это поля, которые сериализуются.Поэтому имеет смысл указывать NonSerialized в поле.

3 голосов
/ 21 сентября 2010

Я думаю, что это случай тонкого контроля, требующего больших усилий с вашей стороны. Другими словами, автоматическое свойство по умолчанию будет иметь сериализуемое вспомогательное поле. Если вам нужно что-то кроме значения по умолчанию, вы не можете использовать автоматическое свойство.

Я думал, что использование [field:NonSerialized] против свойства может работать, но это не так. Спецификация C # явно не вызывает сериализуемость поля поддержки, но она включает в себя это (10.7.3):

The following example:
 public class Point {
    public int X { get; set; } // automatically implemented
    public int Y { get; set; } // automatically implemented
}
is equivalent to the following declaration:
public class Point {
    private int x;
    private int y;
    public int X { get { return x; } set { x = value; } }
    public int Y { get { return y; } set { y = value; } }
}

Таким образом, вспомогательное поле сериализуемо (по умолчанию).

0 голосов
/ 04 января 2013

Возможно, вы захотите посмотреть IgnoreDataMemberAttribute, если вы используете WCF.Это работает для авто-свойств.

Работает, даже если вы не пометите все остальные члены как DataMember (что я всегда считаю болезненным), а класс с DataContract

...