Entwickler-Ecke
IO, XML und Registry - Serialize einer Klasse
LL0rd - Mo 01.10.07 12:27
Titel: Serialize einer Klasse
Hallo,
ich möchte gerne die Instanz einer Klasse in einer Datei abspeichern und wieder laden können, dafür habe ich die Serialize Methode von C# entdeckt, die ich sehr gerne nutzen würde. Ich habe mir deshalb das tutorial aus der C-Sharp-Library.de angeschaut und es entsprechend angepasst. Doch nun habe ich folgendes Problem (was z.T. an der Architektur des Projektes liegt *denk*).
Die Instanz ist eine Liste von Elementen, die von einer abstrakten Klasse abgeleitet wurden. Diese abgeleiteten Klassen befinden sich in dem ausführbaren Projekt. Die Serialize Methode befindet sich widerum in einem Paket, dass per DLL Referenz hinzugeladen wird.
Und genau aus diesem Grund bekomme ich folgende Fehlermeldung:
Quelltext
1:
| System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type User.CLongLineSegment was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically. |
User.CLongLineSegment ist wiegesagt einer der Typen, der in dem .exe Projekt steckt und abgeleitet wurde.
Ich habe eigentlich gehofft, dass das Voranstellen von
C#-Quelltext
1:
| [XmlInclude(typeof(CImageObject))] |
da Abhilfe schafft, aber leider war es nicht so. CImageObject ist wiegesagt die abstrakte Klasse von der User.CLongLineSegment abgeleitet wurde.
Kennt von euch jemand eine Lösung für das Problem? Oder muss ich die Export/Import Prozedur per Hand schreiben?
Kha - Mo 01.10.07 12:46
Die Fehlermeldung sagt es doch eigentlich schon: Du musst alle von CImageObject (btw, mit C-Präfixen für Klassennamen wirst du bei den meisten .Net-Entwicklern auf Unverständnis treffen ;) ) abgeleiteten Klassen, die serialisiert werden sollen, in eine XmlInclude verpacken.
PS: Brauchst du denn die XML-Datei zwingend? Ansonsten ist binäre Serialisierung auf jeden Fall vorzuziehen.
LL0rd - Mo 01.10.07 12:58
Hmm... ja, das habe ich mir auch schon gedacht, nur dummerweise kann die .dll Datei ja nicht vorher wissen, welche Klassen ich alle von der CImageObject Klasse ableiten werden, dementsprechend kann ich die Klasse auch nicht bei XmlInclude benutzen (oder zumindest habe ich keine Ahung, was ich machen kann, damit es geht. Denn wenn ich jetzt
C#-Quelltext
1:
| [XmlInclude(typeof(CLongLineSegment))] |
schreibe, bekomme ich folgenden Fehler:
Quelltext
1:
| Error 39 The type or namespace name 'CLongLineSegment' could not be found (are you missing a using directive or an assembly reference? |
Kha - Mo 01.10.07 13:14
Wenn die Dll keinerlei Referenz auf die Exe enthalten darf, wird das mit Xml-Serialisierung wohl wirklich etwas schwierig. Hängt wahrscheinlich damit zusammen, dass die XML-Datei ein statisches Schema besitzen muss, alle Klassen also zur Kompilierzeit bekannt sein müssen.
Mit binärer Serialisierung sollte das aber immer noch funktionieren, hoffe ich jedenfalls mal ;) .
LL0rd - Mo 01.10.07 13:27
Naja, wenn ich das ganze binär serialisieren möchte, dann taucht bei mir folgende Exception auf, mit der ich - so leid es mir tut - nichts anfangen kann:
Quelltext
1:
| System.Runtime.Serialization.SerializationException: Type 'System.Threading.Mutex' in Assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable. |
Kha - Mo 01.10.07 13:57
Dass es wenig Sinn macht, einen Mutex zu serialisieren, dürfte klar sein :) . Fragt sich, wie der dort reingekommen ist - wahrscheinlich besitzt eine deiner zu serialiserenden Klassen ein Mutex-Feld. Dieses musst du per NonSerializedAttribute ausschließen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!