Pourquoi ne fonctionne pas [NonSerialized] sur les propriétés autoimplemented?
-
04-10-2019 - |
Question
[Serializable]
class MyClass
{
[NonSerialized] int Foo { get; set; } // error
[NonSerialized] int bar; // ok
}
Pourquoi est-ce refusée?
Je sais que sur les solutions de contournement comme
- la mise en œuvre ISerializable
- commutation à XmlSerializer / XmlIgnore
- commutation à une propriété mis en oeuvre manuellement
La question est spécifiquement pourquoi est [NonSerialized] sur properies sur Rejeté, encore admis sur les champs.
La solution
sont en fait des méthodes, ils ne sont pas sérialisés par le processus de sérialisation binaire. Ce sont les champs qui sont sérialisés. Donc, il est logique de préciser NonSerialized
sur un champ.
Autres conseils
Je pense que c'est un cas de contrôle à grains fins nécessitant plus d'effort de votre part. En d'autres termes, une propriété automatique par défaut un champ de support sérialisable. Si vous voulez autre chose que la valeur par défaut, vous ne pouvez pas utiliser une propriété automatique.
Je pensais que l'utilisation [field:NonSerialized]
contre le travail des forces de la propriété, mais il ne fonctionne pas. La spécification C # ne pas appeler explicitement la sérialisation du champ de support, mais il ne comprend ce (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; } }
}
Ainsi, le champ de support est serializable (valeur par défaut).
Vous pouvez vouloir regarder IgnoreDataMemberAttribute
si vous utilisez WCF. Cela fonctionne sur les propriétés auto.
fonctionne même si vous ne marquez pas tous les autres membres comme DataMember
(que je trouve toujours une douleur) et la classe avec DataContract