myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE
   » Gadget für Windows
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin
» Accessoires

Ressourcen
» .NET-Glossar
» guide to C#
» openbook: Visual C#
» openbook: OO
» .NET BlogBook
» MSDN Webcasts
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Bankverbindung
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Rund um die Programmierung » Objekt serialisieren, obwohl dessen Basisklasse nicht [Serializable] ist?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Bunnychecker Bunnychecker ist männlich
myCSharp.de-Mitglied

Dabei seit: 26.11.2009
Beiträge: 224


Bunnychecker ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
28.03.2012 22:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Team (Admin)

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 48.998
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
29.03.2012 08:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Bunnychecker Bunnychecker ist männlich
myCSharp.de-Mitglied

Dabei seit: 26.11.2009
Beiträge: 224

Themenstarter Thema begonnen von Bunnychecker

Bunnychecker ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Bunnychecker am 29.03.2012 09:35.

29.03.2012 09:35 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Team (Admin)

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 48.998
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
29.03.2012 10:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Bunnychecker Bunnychecker ist männlich
myCSharp.de-Mitglied

Dabei seit: 26.11.2009
Beiträge: 224

Themenstarter Thema begonnen von Bunnychecker

Bunnychecker ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Mir ist gerade noch etwas anderes eingefallen, könnte man nicht den XmlSerializer dafür verwenden, der dann nur die public Properties abspeichert?
31.03.2012 16:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Team (Admin)

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 48.998
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Bunnychecker,

Zitat:
... 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
31.03.2012 17:35 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 2 Jahre.
Der letzte Beitrag ist älter als 2 Jahre.
Antwort erstellen


© Copyright 2003-2014 myCSharp.de-Team. Alle Rechte vorbehalten. 21.10.2014 07:19