Die Serialisierung einer Klasse mit events
Habe ich eine Klasse wie folgt aus:
public delegate void ChangedEventHandler(object sender, EventArgs e);
[Serializable]
public class valueDouble
{
public event ChangedEventHandler Changed;
public double value
{
get { return _value; }
set
{
_value = value;
if (Changed != null)
{
Changed(this, EventArgs.Empty);
}
}
}
private double _value = 0;
}
Ich habe auch eine andere Klasse (StepPulseblaster), die nicht serialisierbar und fügt einen Ereignis-Handler
valDouble.Changed += new ChangedEventHandler(sc_PropertyChanged);
Wenn ich versuche zu serialisieren der valueDouble Klasse, gibt es einen Fehler:
The Type StepPulseblaster is not marked as serializable
Wenn ich kommentieren Sie die Zeile
valDouble.Changed += ...
wird es keine Fehler mehr.
Wie kann ich die Serialisierung einer Klasse, die einige Ereignisse verbunden?
- Wollen Sie die Ereignisse immer noch da sein, wenn Sie deserialisiert werden, oder wollen Sie serialisieren Sie die Daten ohne die Ereignisse?
- Ich benutze das Event zum aktualisieren einer GUI, deshalb Brauch ich das Ereignis nach dem Deserialisieren ich es. Ich habe über 1000 Duplikate dieser Klasse, so dass ich nicht wirklich wollen, um das Ereignis zu löschen, bevor die Serialisierung und erstellen Sie es erneut.
- Okay, nächste Frage: warum sind Sie mit der Serialisierung das Objekt? Speichern Sie es irgendwo und laden Sie es später, oder sind Sie zugänglich zu machen, um einem anderen Kontext (z.B. einer anderen AppDomain oder einem anderen Prozess)? Sie werden nicht in der Lage zu serialisieren Sie den Verweis auf die GUI, aber je nachdem, was Sie benötigen, kann es leicht sein, Wege zu erreichen, was Sie wollen.
- Ich möchte auf der Festplatte speichern und in der Lage sein, um Sie später wiederherstellen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie tun:
Wie beschrieben in die docs:
Dem Attribut NonSerialized ist nur verfügbar für Felder, so zu verwenden, müssen Sie passen Sie Ihre code-Felder verwenden.
Versuchen Sie, erstellen Ihre Veranstaltung wie dieser:
Dann in die value-Eigenschaft verwenden Sie das Feld nicht die Eigenschaft:
Entweder daneben StepPulseBlaster als serialisierbar oder verwenden Sie den XmlIgnore-Attribut, um zu verhindern, dass Geändert wird serialisiert.
Verwenden Sie die
[NonSerialized]
Attribut zu vermeiden Serialisierung der Veranstaltung.