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