Deserialisierung und notwendige Konstruktoren

Hallo,

ich habe folgendes Probelm. Vielleicht kann mir jemand weiterhlefen.

Es existieren:

  • Basisklasse x, implmementiert ISerializable.

  • 10 Klassen a-j die von x abgeleitet sind.

  • Kontainer-Klasse die eine Liste von x (List) enthält.
    a-j haben jeweils einen leeren Konstruktor

    public a/J(string name, int nummer) : base(name, nummer)

der ausschließlich den Konstruktor der Basisklasse

public x(string name, int nummer)

aufruft.

Die Kontainer-Objekte können nun (binär) serialsiert und deserialisiert werden. Das funktioniert problemlos.

Jetzt wurden die genannten Klassen um einen string erweitert, der in jedem Konstruktor erwartet wird und in x gespeichert wird

x(string name, int nummer, string neu) und entsprechend
a/j(string name, int nummer, string neu):base(name, nummer, neu)

.

Seit dem funktioniert das Deserialisieren nicht mehr. Serialisieren geht, beim Deserialisieren bekomme ich folgende Fehlermeldung:
„Der für die Deserialiserung eines Objekts mit dem Typ x erforderliche Konstruktor wurde nicht gefunden“.

Wenn ich jetzt in jeder Klasse a-j ISerializable implementiere gehts wieder. Allerdings will ich das nicht, denn schließlich hat es ja auch auch zuvor geklappt. Warum jetzt nicht mehr?

Freut mich wenn mir jemand antworten kann!
Grüße und Danke,
Klaus

Hallo!

Ich hab’s mal probiert, aber ohne den Konstruktor mit SerializationInfo und StreamingContext auch in der abgeleiteten Klasse konnte ich bei expliziter Implementierung von ISerializable das Ganze überhaupt nicht zum Laufen bekommen.
Ist ja IMO irgendwo auch logisch - in der abgeleiteten Klasse kann man beim oben genannten Konstruktor noch weitere Daten, die die Oberklasse nicht hat, aus den Serialisierungsinfos holen und zudem den entsprechenden Konstruktor der Basisklasse aufrufen.

Oder hab’ ich das Problem noch nicht verstanden?

Gruß,
Martin

Und wie funktioniert base über mehre Ebenen hinweg
Ok, jetzt hab ich also doch überall den zusätzlichen Konstruktor und die ISerializable.GetObjectData()-Methode implementiert.

Allerdings ist jetzt hab ich eigentlich 4 Klassenebenen:

a-j abgeleitet von x abgeleitet von abc abgeleitet von rst

Wie kann ich jetzt beim Deserialisieren von a sicherstellen, dass auch die GetObjectData()-Methoden von x, abc und rst aufgerufen werden?
Ich dachte an base.GetObjectData() - alleridngs führt das direkt zu einem Aufruf von rst.getObjectData(). x.GetObjectData() und abc.GetObjectData() werden nicht aufgerufen!

Kann mir jemand weiterhelfen? Sollte doch möglich sein?!?

Vielen Dank und viele Grüße,
Klaus

Ups… hat sich erledigt - hatte nen Schlechtschreibfehler weshalb eine von der falschen Klasse geerbt wurde, die die Methode nicht implemtniert hatte…