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.

War es hilfreich?

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top