2009-11-13 4 views
36

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

ответ

59

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

Или вы можете использовать [поле: NonSerialized] непосредственно на имущество. – profou

4

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

4

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

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

Или отказаться от авто-недвижимости для этого конкретного поля.

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

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

4

Невозможно для авто реализованных свойств. Описание:

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

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

3

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

6

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

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

Так что ваш код будет:

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

    public object DoNotIgnoreMe { get; set; } 
}