Как предотвратить автоматически реализованные свойства сериализации? - PullRequest
36 голосов
/ 13 ноября 2009

Как можно предотвратить сериализацию автоматически реализованного свойства двоичным форматером? Атрибут [NonSerialized] можно использовать только с полями. И поле скрыто при использовании автоматически реализованных свойств.

Ответы [ 7 ]

59 голосов
/ 13 ноября 2009

Не поддерживается для автоматически реализованных свойств. Вы должны использовать вспомогательное поле и установить на него NonSerializedAttribute .

public class ClassWithNonSerializedProperty {

  [NonSerialized]
  private object _data;  // Backing field of Property Data that is not serialized

  public object Data{
    get { return _data; }
    set { _data = value; }
  }
}
8 голосов
/ 13 ноября 2009
// This works for the underlying delegate of the `event` add/remove mechanism.
[field:NonSerialized]
public event EventHandler SomethingHappened;

Но это не похоже на автоматически реализованные свойства. Я подумал, что стоит упомянуть, потому что это полезно знать при сериализации объекта с присоединенными подписчиками событий.

6 голосов
/ 19 июля 2013

Если вы сериализуете в Json и используете сериализатор Json.NET (который я настоятельно рекомендую, поскольку он может предложить гораздо больше, чем ряд других сериализаторов на рынке), тогда вы можете достичь желаемого результата по свойствам, используя [JsonIgnore].

Вам не нужно создавать поле.

Итак, ваш код будет:

public class ClassName
{
     [JsonIgnore]   
     public object IgnoreMe { get; set; } 

     public object DoNotIgnoreMe { get; set; } 
}
4 голосов
/ 14 января 2010

Это невозможно для автоматически реализованных свойств. Подумайте о следующем:

Это поведение "по замыслу". В то время, когда авто-свойства были реализованы, было решено, что они будут работать в «общем случае», что, среди прочего, означает отсутствие атрибутов в сгенерированном поле. Идея заключается в том, чтобы держать их простыми, а не постепенно превращать их в полноценные свойства. Так что, если вам нужно использовать атрибут NonSerialized, полные свойства - вот путь.

(http://social.msdn.microsoft.com/Forums/en-US/vcsharp2008prerelease/thread/2b6eb489-122a-4418-8759-10808252b195)

4 голосов
/ 13 ноября 2009

Я не уверен, что ты можешь. В этой статье MSDN о SerializableAttribute предлагается реализовать ISerializable и самостоятельно управлять сериализацией:

Все открытые и закрытые поля в типе, помеченные атрибутом SerializableAttribute, сериализуются по умолчанию, если только тип не реализует интерфейс ISerializable для переопределения процесса сериализации.

Или отключите авто-свойство для этого конкретного поля.

4 голосов
/ 13 ноября 2009

Если вы сериализуете в Xml, вы можете использовать атрибут XmlIgnore.

3 голосов
/ 13 декабря 2011

Предложенное решение использования несериализованного вспомогательного поля, похоже, не работает должным образом с .NET 4.0 (по крайней мере, в случае сериализации Xml). Поле действительно не сериализуется, но публичное свойство, которое его использует, сериализует и, таким образом, игнорирует цель. Использование обходного пути XmlIgnore помогает в случае сериализации Xml. Отказ от ответственности - я не проверял поведение двоичной сериализации.

...