Autor Beitrag
LL0rd
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mo 01.10.07 13:27 
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:

ausblenden 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 01.10.07 13: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mo 01.10.07 13: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

ausblenden C#-Quelltext
1:
[XmlInclude(typeof(CLongLineSegment))]					


schreibe, bekomme ich folgenden Fehler:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 01.10.07 14: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mo 01.10.07 14: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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 01.10.07 14: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.