c# - sirven - ¿Cómo evitar que se serialicen las propiedades implementadas automáticamente?
que es get en programacion (7)
La solución propuesta de usar un campo de respaldo no serializado no parece funcionar correctamente con .NET 4.0 (al menos en el caso de la 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.
¿Cómo puedo evitar que el formateador binario serialice una propiedad implementada automáticamente? El atributo [NonSerialized] solo se puede usar con campos. Y el campo está oculto cuando se usan propiedades implementadas automáticamente.
No es compatible con las propiedades implementadas automáticamente. NonSerializedAttribute usar un campo de respaldo y establecer 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; }
}
}
No es posible para las propiedades implementadas automáticamente. Considera seguir:
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 usar el atributo NonSerialized, las propiedades completas son la manera.
No estoy seguro de que puedas. Este artículo de MSDN sobre SerializableAttribute
sugiere que implemente ISerializable y controle la serialización usted mismo:
Todos los campos públicos y privados de un tipo que están marcados por SerializableAttribute se serializan de manera predeterminada, a menos que el tipo implemente la interfaz ISerializable para anular el proceso de serialización.
O aléjese de una propiedad automática para ese campo específico.
Si está serializando a Json y utilizando el serializador Json.NET (que recomiendo mucho, ya que tiene mucho más que ofrecer que una serie de otros serializadores en el mercado), entonces puede lograr el resultado deseado en las propiedades usando [JsonIgnore]
.
No es necesario crear un campo.
Entonces tu código sería:
public class ClassName
{
[JsonIgnore]
public object IgnoreMe { get; set; }
public object DoNotIgnoreMe { get; set; }
}
Si está serializando a Xml, puede usar el atributo XmlIgnore.
// This works for the underlying delegate of the `event` add/remove mechanism.
[field:NonSerialized]
public event EventHandler SomethingHappened;
Pero no parece 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.