6
votes

Pourquoi ne fonctionne-t-il pas [non-séralisé] sur les propriétés auto-écran?

[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.

0 commentaires

3 Réponses :


3
votes

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 [champ: non-séralisé] 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): xxx

Ainsi, le champ de support est sérialisable (le Par défaut).


0 commentaires

12
votes

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é sur un champ.


3 commentaires

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é 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 , 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é.



0
votes

Vous voudrez peut-être regarder IgnoredataMemberattribute si vous utilisez WCF. Cela fonctionne sur les propriétés automatiques.

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


0 commentaires