Mitserialisiering von Objekten, welche einen Event abonnieren

DrMueller

Erfahrenes Mitglied
Huhu,

mal wieder etwas merkwürdiges, was ich mir nicht ganz erklären kann:
Ich möchte ein Objekt serialisieren. Dieses dient dazu, mit einem Usercontrol zu interagieren.
Da beim Wechsel eines bestimmten Wertes, auch das UserControl etwas machen muss, habe ich dies als Event im Object bereit gestellt:

Code:
        private Boolean isFocused;
        public Boolean IsFocused
        {
            get
            {
                return isFocused;
            }
            set
            {
                isFocused = value;
                if (FocusChanged != null)
                    FocusChanged();
            }
        }

Danach lasse ich beim Laden des UserControls dieses den Event abonnieren und mache die entsprechenden Sachen dort drin.
Allerdings ist nun interessant, dass beim Serialisieren, anscheinend das UserControl auch mitserialisiert werden soll.

Ich verstehe, dass das Event Objekt die Abonnenten gespeichert hat, aber ich kann ja ein UserControl nicht serialisierbar machen.
Gibt es denn da eine einfache Lösung, wie man das Problem umgehen kann? Ich nehme an, der Fall taucht noch recht häufig auf?

Ich nehme an, das Event Objekt speichert auch die Abonnenten, allerdings lässt sich dieses nicht als Nonserialized kennzeichnen.


Wie immer vielen Dank im Voraus


Müller Matthias
 

Shakie

Erfahrenes Mitglied
Du musst das Event manuell implementieren (google nach 'C# custom event') und dann die Liste, welche die Delegaten zu den Event-Handler-Funktionen speichert, als NonSerialized markieren.
Dann kannst du das Objekt deserialisieren. Beim Serialisieren darfst du nicht vergessen, die Events ggf. wieder zu abonnieren.
 

DrMueller

Erfahrenes Mitglied
äh sorry, sonst gar nicht meine Art direkt nachzufragen.
Das mit dem manuellen Event ist ja klar, aber welche Liste speichert denn die Delegaten zu den der Event-Funktion?
Ich hab z.B. so was nachgeschaut http://windowsdevcenter.com/dotnet/2002/04/15/events.html, also wenn ich dich richtig verstehe, meinst du ja mit manuell implementieren per eigenem Delegate, was ich auch gemacht habe.
Nun bekomm ich aber immer dann den Fehler:
Fehler 1 Das NonSerialized-Attribut ist für diesen Deklarationstyp ungültig. Es ist nur für field-Deklarationen gültig.
 

Shakie

Erfahrenes Mitglied
  1. Es gibt eine viel einfachere Lösung, als die von mir oben vorgeschlagene: du kannst das Event mittels 'field'-Keyword direkt als NonSerialized markieren, siehe z.B. hier oder hier (da hatte ich heute Nachmittag nicht dran gedacht).
  2. Falls du dich doch für die 'Custom Event'-Implementation entscheidest: du musst die Variable vom Typ EventHandler als NonSerialized markieren, siehe ebenfalls hier.
  3. Das Beispiel, dass du gefunden hast, finde ich konfus :rolleyes:
 

DrMueller

Erfahrenes Mitglied
Ich hab zwar keine Ahnung, was Field macht, aber es scheint zu funktionieren.
Wenn ich es richtig sehe, markiert Field: nicht den Event selber, sondern das Field mit dem Delegaten dann als nicht serialisierbar?

Naja klappt auf jeden Fall irgendwo.
 

Neue Beiträge