Laden...

Objekt serialisieren, obwohl dessen Basisklasse nicht [Serializable] ist?

Erstellt von Bunnychecker vor 12 Jahren Letzter Beitrag vor 11 Jahren 2.161 Views
B
Bunnychecker Themenstarter:in
224 Beiträge seit 2009
vor 12 Jahren
Objekt serialisieren, obwohl dessen Basisklasse nicht [Serializable] ist?

Guten Abend.

Ich habe eine Klasse, die vom WebClient (Component) ableitet und möchte diese gerne serialisieren. Wie erreiche ich, dass der WebClient auch als serialisierbar gekennzeichnet wird, da ich immer die Fehlermeldung erhalte, dass der WebClient nicht als serialisierbar gekennzeichnet ist.
Die Klasse an sich hat das Attribut [Serializable]

Ich nutze den BinaryFormatter zur Serialisierung.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Bunnychecker,

sofern der Autor der Basisklasse das SerializableAttribute nicht aus Versehen weggelassen hat, hat es normalerweise seinen Sinn, wenn eine Klasse (insbesondere eine aus dem .NET Framework) nicht als [Serializable] gekennzeichnet ist. Beim WebClient finde ich es offensichtlich, denn wie sollte die geöffnete Verbindung serialisiert und beim Deserialisieren wiederhergestellt werden? Vielleicht nicht vollkommen undenkbar, aber in der Praxis meistens unmöglich.

Wenn du ein Objekt einer Unterklasse einer nicht serialisierbaren Oberklasse serialisieren willst, ist normalerweise irgendwas im Entwurf faul oder man macht irgendeinen Denkfehler. Als erstes solltest du prüfen, ob überhaupt eine IST-EIN-Beziehung zwischen Unterklasse und Oberklasse besteht. Meistens reicht es, wenn man sich fragt, ob der Satz "jede/s/r KlasseA ist ein/e KlasseB" Sinn macht, wenn man für KlasseA den Namen der Unterklasse und für KlasseB den Namen der Oberklasse einsetzt.

Wenn das nicht der Fall ist, sollte man sich fragen ob stattdessen der Satz "jede/s/r KlasseA hat ein/e/n KlasseB" Sinn macht. Wenn ja, dann sollte KlasseA ein Objekt der KlassseB als privates Feld oder (öffentliche) Property enthalten, das/die als [NonSerialized] gekennzeichnet ist.

Das alles gilt für binäre Serialisierung. Für XML-Serialisierung gelten die genannten Attribute nicht. Zu den Unterschieden siehe Untersch. Behandlung der Objektdaten bzgl. Modifizierer bei Serialisierung in den versch. Formaten. Was aus den Unterschieden für den konkreten Fall resultiert, kann man sich leicht selbst überlegen.

herbivore

B
Bunnychecker Themenstarter:in
224 Beiträge seit 2009
vor 12 Jahren

Hallo herbivore,

vielen Dank für die ausführliche Antwort.

Ich benutze den ExtendedWebClient von dN!3L und habe diesen mit öffentlichen Properties wie Timeout und verschiedenen HTTP-Header erweitert, die ich gerne nach Programmneustart wiederhergestellt hätte.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Bunnychecker,

ich würde die Einstellungen vermutlich als extra Klasse auslagern. Das hat dann auch den Vorteil, dass man Objekte dieser Klasse nicht nur für den WebClient als ganzes, sondern auch für einzelne Requests verwenden könnte. Dann hast du eine reine Datenklasse ohne Oberklasse. Die Datenklasse kannst du problemlos als [Serializable] kennzeichnen. Der erweitere WebClient hätte dann eine neue Property vom Typ der Datenklasse.

herbivore

B
Bunnychecker Themenstarter:in
224 Beiträge seit 2009
vor 11 Jahren

Mir ist gerade noch etwas anderes eingefallen, könnte man nicht den XmlSerializer dafür verwenden, der dann nur die public Properties abspeichert?

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo Bunnychecker,

... der dann nur die public Properties abspeichert?

nur die public Properties mit Getter und Setter.

Den XmlSerializer kannst du schon nehmen, nur würde ich an deiner Stelle trotzdem meinen Vorschlag umsetzen.

herbivore