Почему [нереализация] не работает при автопромементированных свойствах?
-
04-10-2019 - |
Вопрос
[Serializable]
class MyClass
{
[NonSerialized] int Foo { get; set; } // error
[NonSerialized] int bar; // ok
}
Почему это запрещено?
Я знаю о взаимодействиях, таких как
- реализация изомерие
- Переключение на xmlserializer / xmlignore
- Переключение на вручную реализованное свойство
Вопрос конкретно Зачем несущественно] запрещено на пассиях, но допускается на полях.
Решение
Свойства на самом деле являются методами, они не сериализуются процессом двоичного сериализации. Это поля, которые сериализуются. Так что только имеет смысл указывать 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