Как предотвратить сериализацию автоматически реализованных свойств?

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

Ответ 1

Он не поддерживается для автоматически реализованных свойств. Вы должны использовать фоновое поле и установить 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; }
  }
}

Ответ 2

// This works for the underlying delegate of the `event` add/remove mechanism.
[field:NonSerialized]
public event EventHandler SomethingHappened;

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

Ответ 3

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

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

Таким образом, ваш код будет выглядеть следующим образом:

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

     public object DoNotIgnoreMe { get; set; } 
}

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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