Как предотвратить автоматически реализованные свойства сериализации?
Как я могу предотвратить сериализацию автоматически реализуемого свойства? Атрибут [NonSerialized] можно использовать только с полями. И поле скрыто при использовании автоматически реализованных свойств.
7 ответов
Не поддерживается для автоматически реализованных свойств. Вы должны использовать вспомогательное поле и установить на него атрибут 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; }
}
}
// This works for the underlying delegate of the `event` add/remove mechanism.
[field:NonSerialized]
public event EventHandler SomethingHappened;
Но это не похоже на автоматически реализованные свойства. Я подумал, что стоит упомянуть, потому что это полезно знать при сериализации объекта с присоединенными подписчиками событий.
Если вы сериализуете в Json и используете сериализатор Json.NET (который я настоятельно рекомендую, поскольку он может предложить гораздо больше, чем ряд других сериализаторов на рынке), вы можете достичь желаемого результата в свойствах, используя [JsonIgnore]
,
Вам не нужно создавать поле.
Итак, ваш код будет:
public class ClassName
{
[JsonIgnore]
public object IgnoreMe { get; set; }
public object DoNotIgnoreMe { get; set; }
}
Это невозможно для автоматически реализованных свойств. Рассмотрим следующее:
Такое поведение является особенностью". В то время, когда авто-свойства были реализованы, было решено, что они будут работать в "общем случае", что, среди прочего, означает отсутствие атрибутов в сгенерированном поле. Идея заключается в том, чтобы держать их простыми, а не постепенно превращать их в полноценные свойства. Таким образом, если вам нужно использовать атрибут NonSerialized, полные свойства - путь.
Если вы сериализуете в Xml, вы можете использовать атрибут XmlIgnore.
Я не уверен, что ты можешь. Эта статья о MSDNSerializableAttribute
предлагает вам реализовать ISerializable и контролировать сериализацию самостоятельно:
Все открытые и открытые поля в типе, помеченные атрибутом SerializableAttribute, сериализуются по умолчанию, если только тип не реализует интерфейс ISerializable для переопределения процесса сериализации.
Или отключите авто-свойство для этого конкретного поля.
Предложенное решение использования несериализованного вспомогательного поля, похоже, не работает должным образом с.NET 4.0 (по крайней мере, в случае сериализации Xml). Поле действительно не сериализуется, но публичное свойство, которое его использует, сериализует и, таким образом, игнорирует цель. Использование обходного пути XmlIgnore помогает в случае сериализации Xml. Отказ от ответственности - я не проверял поведение двоичной сериализации.