Почему [NonSerialized] не работает с автоматически реализованными свойствами?

[Serializable]
class MyClass
{
    [NonSerialized] int Foo { get; set; } // error
    [NonSerialized] int bar; // ok
}

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

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

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

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

3 ответа

Решение

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

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

Я думал, что с помощью [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; } }
}

Таким образом, поле поддержки является сериализуемым (по умолчанию).

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

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

Другие вопросы по тегам