Почему [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