Struktur mit 'Fremdobjekten' abspeichern

Hitman II

Mitglied
Hallo

Also, ich habe folgendes Problem: Ich habe einen Konfigurationsdialog für DirectX programmiert. Mit einem Klick auf die OK-Taste speichere ich dann die ausgewählten Einstellungen in eine Struktur, und diese dann in eine externe Datei...
Code:
// Pseudo Struktur
[Serializable]
public struct Direct3DConfiguration
{
     int nbrsOfDevices;

     Device device;
     DeviceType deviceType;
     DisplayMode displayMode;
}
Allerdings funktioniert das ganze nicht mit serialisieren, das Programm stürzt beim speichern immer ab. Die Fehlermeldung sagt, das Objekte wie z.B. DeviceType (DirectX-Objekt) nicht serialisierbar sind. Wie kann ich diese Stuktur trotzdem abspeichern?

PS: Das Problem hat grundsätzlich nichts mit DirectX zu tun, sondern kann auch bei anderen DLL-Klassen auftreten. Nur für diejenigen unter euch, bei denen beim Wort DirectX schon die Alarmglocken schrillen :)

mfg Hitman
 
Weil diese Objekte nicht serialisierbar sind.

Du könntest aber hergehen und dir einen eignen De-/Serializer schreiben, der genau das für dich übernimmt.
 
Kann mir da wirklich niemand weiterhelfen? Es muss nicht unbedingt die gesamte Struktur gespeichert werden, ich wäre schon froh, wenn ich wüsste, wie man eine Instanz des Typs 'VideoMode' usw. separat abspeichert. Mit dem BinaryWriter geht das ja nicht, da es sich nicht um einen Basisdatentypen handelt.

mfg Hitman
 
Hallo Hitman II !
(War übrigens ein geiles Spiel! ;-) :D)

Ich gehe mal davon aus das Device, DeviceType, DisplayMode wiederum Klassen/Strukturen sind welche einfach nur die Kontainer für die zu speichernden Parameter darstellen.
D.h. es befinden sich einfach nur Variablen/Array's drinn deren Datentyp von System abgeleitet ist. Gehe ich richtig mit der Annahme?
Wenn es so währe, könntest Du ja einfach auch diese als Serializable daklarieren.
Somit sollte es eigentlich moglich sein, die gesammte Struktur zu serialisieren.

MfG, cosmo
 
Das sind Typen von DirectX, glaube kaum das Hitman II zugrif auf den SourceCode davon hat, und diesen umschreiben kann.

cosmochaosmaker hat gesagt.:
Hallo Hitman II !
(War übrigens ein geiles Spiel! ;-) :D)

Ich gehe mal davon aus das Device, DeviceType, DisplayMode wiederum Klassen/Strukturen sind welche einfach nur die Kontainer für die zu speichernden Parameter darstellen.
D.h. es befinden sich einfach nur Variablen/Array's drinn deren Datentyp von System abgeleitet ist. Gehe ich richtig mit der Annahme?
Wenn es so währe, könntest Du ja einfach auch diese als Serializable daklarieren.
Somit sollte es eigentlich moglich sein, die gesammte Struktur zu serialisieren.

MfG, cosmo
 
Alexander Schuc hat leider recht. Um den Vorschlag von cosmochaosmaker zu verwirklichen müsste ich die DirectX-Dll manipulieren, was sich als recht schwierig herausstellen könnte... :)

Aber diese Datentypen bestehen ja im Grunde auch nur aus Bits und Bytes. Also sollte es doch im Grunde auch möglich sein, diese Binär abzuspeichern?

Natürlich kann ich einfach nur die ToStrings() abspeichern und dann beim Laden mit Switch() je nach Name den Datentypen neu erstellen. Ist aber nicht der sauberste Weg, wenn es noch andere Möglichkeiten gibt.

PS: Mein Nick ist Hitman II, weil sich irgendjemand das Original schon geschnappt hat :mad: Aber du hast recht, Teil II ist und bleibt bis auch weiteres der beste der Serie (bin ja gespannt auf Teil IV)

mfg Hitman
 
Oh, ich hab schlampig nachgelesen. :-(
Das Problem hat grundsätzlich nichts mit DirectX zu tun,
hatte mich da jetzt verwirrt. Ich dachte Du willst nur die Parameter speichern.
Sag mal was bringt es ganze DX Objekte zu serialisieren?
Währe es nicht sinnvoller nur die Parameter zu serialisieren mit denen diese Konfiguriert werden?
 
Danke für den Tipp. Daran habe ich noch gar nicht gedacht. Allerdings brauche ich zum erstellen eines Device-Objekts z.B. ein PresentParameters-Objekt... und für dessen Initialisierung brauche ich wiederum andere Objekte... Was ich damit sagen will: Das ganze schachtelt sich ganz schön tief. Aber es wird mir dann ja wohl nichts anderes übrigbleiben.

Vorschläge sind aber nach wie vor willkommen.

mfg Hitman
 
Erstell doch einfach sowas wie ein Initialisierungsnamespace in welchem Du die Initalisierungsroutinen in Klassen packst.
Implementiere entweder Funktionen denen Du die Initialisierungsparameter übergibst und die Dir dann die DXObjekte zurückgeben.
Oder Du übergibst den Klassen im Konstuktor die Initialisierungsparameter und ließt anschließend die/das erstellte(n) Objekt(e) aus.

MfG, cosmo
 
Zurück