¿Por qué no [NonSerialized] trabajo sobre las propiedades autoimplemented?
-
04-10-2019 - |
Pregunta
[Serializable]
class MyClass
{
[NonSerialized] int Foo { get; set; } // error
[NonSerialized] int bar; // ok
}
¿Por qué esta anulado?
Yo sé de las soluciones tales como
- implementar ISerializable
- cambiar a XmlSerializer / XmlIgnore
- cambiar a una propiedad implementado manualmente
La pregunta es específicamente ¿Por qué es [NonSerialized] no permitidos en Properies, sin embargo, admiten bajo campos.
Solución
Las propiedades son en realidad métodos, que no son serializados por el proceso de serialización binaria. Es los campos que son serializados. Por lo que sólo tiene sentido para especificar NonSerialized
en un campo.
Otros consejos
creo que este es un caso de control de grano fino que requiere más esfuerzo por su parte. En otras palabras, una propiedad automática tendrá por defecto un campo respaldo serializable. Si desea otra cosa que no sea el predeterminado, entonces no se puede utilizar una propiedad automática.
Yo había pensado que el uso de [field:NonSerialized]
en contra de la fuerza de trabajo propiedad, pero no lo hace. La especificación de C # no llama explícitamente la serialización del campo de respaldo, pero sí incluye este (10.7.3):
The following example:
public class Point {
public int X { get; set; } // automatically implemented
public int Y { get; set; } // automatically implemented
}
is equivalent to the following declaration:
public class Point {
private int x;
private int y;
public int X { get { return x; } set { x = value; } }
public int Y { get { return y; } set { y = value; } }
}
Así, el campo de soporte es serializable (el valor predeterminado).
Es posible que desee ver en IgnoreDataMemberAttribute
si está utilizando WCF. Esto funciona en auto-propiedades.
Obras incluso si usted no marca todos los demás miembros como DataMember
(que siempre me pareció ser un dolor) y la clase con DataContract