Как я могу предотвратить преобразование автоматически реализованного свойства в бинарный форматтер? Атрибут [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, то все свойства будут следующими.
Ответ 7
Предлагаемое решение использования несериализованного поля поддержки, похоже, не работает должным образом с .NET 4.0 (по крайней мере, в случае сериализации Xml). Поле действительно не сериализуется, но общедоступное свойство, которое его использует, сериализуется и, таким образом, побеждает цель. Использование обходного решения XmlIgnore помогает в случае сериализации Xml. Отказ от ответственности - я не проверял поведение двоичной сериализации.