Почему [нереализация] не работает при автопромементированных свойствах?

StackOverflow https://stackoverflow.com/questions/3760879

Вопрос

[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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top