2009-11-13 22 views

Respuesta

59

No es compatible con las propiedades implementadas automáticamente. Debe usar un campo de respaldo y establecer el NonSerializedAttribute en él.

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

o puede utilizar [field: NonSerialized] directamente en la propiedad. – profou

4

Si está serializando a Xml, puede usar el atributo XmlIgnore.

4

No estoy seguro de que pueda hacerlo. Este MSDN article on SerializableAttribute sugiere que implementan ISerializable y controlar la serialización mismo:

Todos los campos públicos y privados de un tipo que están marcados por el SerializableAttribute son serializados por defecto, a menos que el tipo implementa la interfaz ISerializable para anular el proceso de serialización .

O aléjese de una propiedad de automóvil para ese campo específico.

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

Pero no parece que para las propiedades implementadas automáticamente. Pensé que valía la pena mencionarlo porque es útil saber cuándo serializar un objeto con los suscriptores del evento adjuntos.

4

No es posible para las propiedades implementadas automáticamente. Considere lo siguiente:

Este comportamiento es "por diseño". La decisión en el momento en que se implementaron las auto-propiedades fue que trabajarían en el "caso común" que, entre otras cosas, no significa atributos en el campo generado. La idea detrás de eso es mantenerlos simples y no mutarlos lentamente en propiedades completas. Por lo tanto, si necesita utilizar el atributo NonSerialized, las propiedades completas son la manera.

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

3

La solución propuesta de la utilización de campo respaldo no serializado-no parece funcionar correctamente con .NET 4.0 (al menos en el caso de serialización XML). El campo de hecho no se serializa, pero la propiedad pública que lo usa se serializa y, por lo tanto, anula el objetivo. Usar XmlIgnore workaround ayuda en caso de serialización Xml. Descargo de responsabilidad: no verifiqué el comportamiento de serialización binaria.

6

Si está serializando a Json y usando el Json.NET serializer (que recomiendo mucho, ya que tiene mucho más que ofrecer que otros serializadores en el mercado), entonces puede lograr el resultado deseado en las propiedades usando [JsonIgnore].

No es necesario crear un campo.

lo que el código sería:

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

    public object DoNotIgnoreMe { get; set; } 
} 
Cuestiones relacionadas