Warum funktioniert [NonSerialized] Arbeit auf autoimplemented Eigenschaften?
-
04-10-2019 - |
Frage
[Serializable]
class MyClass
{
[NonSerialized] int Foo { get; set; } // error
[NonSerialized] int bar; // ok
}
Warum dies nicht erlaubt ist?
Ich weiß, über die Workarounds wie
- Umsetzung ISerializable
- Umschalten auf XmlSerializer / XmlIgnore
- Umschalten auf eine manuell implementierter Eigenschaft
Die Frage spezifisch ist Warum ist [NonSerialized] auf properies nicht erlaubt, noch auf den Feldern erlaubt.
Lösung
Eigenschaften sind eigentlich Methoden, werden sie durch die binäre Serialisierung nicht serialisiert. Es sind die Felder, die serialisiert werden. So macht es nur Sinn NonSerialized
auf einem Feld angeben.
Andere Tipps
Ich denke, dies ist ein Fall von feinkörniger Kontrolle mehr Aufwand auf Ihrer Seite benötigen. Mit anderen Worten, wird eine automatische Eigenschaft standardmäßig ein serializable dahinter liegendes Feld hat. Wenn Sie etwas anderes als der Standard wollen, dann können Sie keine automatische Eigenschaft verwenden.
hatte ich gedacht, dass [field:NonSerialized]
gegen die Eigentum Macht der Arbeit, aber es funktioniert nicht. Die C # spec ruft die Serialisierung des Trägerfeld nicht explizit, aber es enthält diese (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; } }
}
Somit ist das Trägerfeld serializable (Standardeinstellung).
Sie können unter IgnoreDataMemberAttribute
, wenn Sie WCF verwenden. Dies funktioniert auf auto-Eigenschaften.
funktioniert auch, wenn Sie nicht alle die anderen Mitglieder als DataMember
markieren und die Klasse mit DataContract
(was ich immer ein Schmerz zu finden sein)