[Serializable] class MyClass { [NonSerialized] int Foo { get; set; } // error [NonSerialized] int bar; // ok } Why is this disallowed?I know about the workarounds such as implementing ISerializable switching to XmlSerializer/XmlIgnore switching to a manually-implemented property The question is specifically why is [NonSerialized] disallowed on properies, yet allowed on fields.
3 Réponses :
Je pense que c'est un cas de contrôle à grain fin, nécessitant plus d'efforts de votre part. En d'autres termes, une propriété automatique sera 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.
J'avais pensé qu'utiliser Ainsi, le champ de support est sérialisable (le Par défaut). p> p> [champ: non-séralisé] code> contre la propriété pourrait fonctionner, mais ce n'est pas le cas. La spécification C # n'appelle pas explicitement la sérialisabilité du champ de support, mais elle comprend ceci (10.7.3): p>
Les propriétés sont en réalité des méthodes, elles ne sont pas sérialisées par le processus de sérialisation binaire. Ce sont les champs sérialisés. Il est donc logique de spécifier non-sérialisé code> sur un champ. P>
Les propriétés ne sont pas de simples méthodes. Sémantiquement, ils sont une combinaison de méthodes et d'un champ de support implicite. Et tous les sérialiseurs existants voient le champ de support. Il est donc logique de contrôler la sérialisation du champ de support implicite via sa propriété.
En effet, ils sont en fait une paire de méthode. Mais le champ de support n'est implicite que pour les propriétés automatiques et pourrait ne pas exister du tout pour des propriétés normales. Quoi qu'il en soit, lorsque l'attribut non-séralisé code> a été introduit, les propriétés automatiques n'existaient pas, de sorte qu'elles n'auraient pas pu prendre en compte cette prise en compte.
OK, et s'ils devaient faire de la non-sérisation valide pour les propriétés maintenant i>, ils devraient différencier les propriétés auto-propriétaires et les propriétés normales dans le document AttributeTarets Enum. Ce que je crois ne peut pas être fait sans casser la compatibilité. Accepté.
Vous voudrez peut-être regarder IgnoredataMemberattribute code>
si vous utilisez WCF. Cela fonctionne sur les propriétés automatiques. P>
fonctionne même si vous ne marquez pas tous les autres membres comme DataMember CODE> (que je trouve toujours une douleur) et la classe avec
Datacontract p> p> P>