Entwickler-Ecke

IO, XML und Registry - Dialog in einer xml Datei speichern!


Qualle7 - Fr 05.03.10 10:13
Titel: Dialog in einer xml Datei speichern!
Guten Morgen!

Ich habe ein kleines Problem meinen selbst geschriebenen Dialog zu speichern!

Bis jetzt speicher ich all meine Daten mit Hilfe des XMLSerializer, dass funktioniert auch wunderbar nur jetzt möchte ich eben meinen Dialog speichern.

Kurz zum Aufbau:

Der Dialog erbt von Form und beinhaltet eine Liste von Registern (diese Klasse erbt von Tabpage) und das Register speichert eine Liste von Blöcken (diese Klasse erbt von Panel).

Je nachdem welches Event jetzt im Programm ausgelöst wird, öffnet sich ein Dialog, der für dieses Event zugeschnitten wurde. In diesem Dialog werden Notizen, Zeiträume und andere wichtige Daten eingegeben, die ich jetzt gerne speichern möchte. Jetzt hab ich natürlich das Problem das die Klassen wegen der Vererbung nicht mit dem XMLSerializer serialisierbar sind.

Ich steh jetzt auf dem Schlauch wie ich das lösen könnte :( und ich hoffe, dass ihr mir vl ein paar Tipps geben könntet?!

mfg Qualle7


danielf - Fr 05.03.10 11:06

Morgen ;)

Wieso kannst du eine Klasse mit Vererbung nicht serialisieren? Hast du dazu eine Fehlermeldung?

Ich habe öfters abstrakte und konkrete Klassen. Wenn ich dann die konkreten Klassen serialisieren will gebe ich bei der abstrakten Klasse die konkreten Klassen als Attribute ( [XmlInclude(...)] ) mit an - dann geht das.

Gruß Daniel


Qualle7 - Fr 05.03.10 11:21

Der Fehler liegt glaub ich darin, dass ich von Panel, Tabpage bzw. Form erbe.

Ich bekomme dann beim Speichern folgende Fehlermeldung:

"Member System.ComponentModel.Component.Site des Typs System.ComponentModel.ISite kann nicht serialisiert werden, da er eine Schnittstelle ist."

Kann ich das mit dem [XMLInclude()] auch umgehen?!

mfg Qualle7


danielf - Fr 05.03.10 11:28

Da gibt es bestimmt noch eine Innere-Exception?

Zeig mal bitte die Klasse die du serialisieren willst. Ich hoffe du hast Daten und View ordentlich getrennt. In der Klasse zum serialisieren sollen nur Daten-Objekte drin sein. Ich habe das Gefühlt du willst das ganze Form serialisieren :o


Qualle7 - Fr 05.03.10 11:40

Nein, dass war die innerste Inner-Exception!


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
 
    public class Dialog : System.Windows.Forms.Form
    {
        #region Attributes

        private TabControl tabControl1;
        private List<Register> registerList;
        private Button bnOK;
        private Button bnCancel;
        private String modulIdentifier;
        private Modul belongingModul;

        #endregion

        #region Properties

        public TabControl TabControl1
        {
            get { return tabControl1; }
            set { tabControl1 = value; }
        }

        public List<Register> RegisterList
        {
            get { return registerList; }
            set { registerList = value; }
        }

        public Modul BelongingModul
        {
            get { return belongingModul; }
            set { belongingModul = value; }
        }

        #endregion

        #region Constructors

        public Dialog(String modulName) : this(createScriptedDialog(modulName))
        {
            this.modulIdentifier = modulName;
        }
      
        public Dialog(List<Register> registerList)
        {
            ...
        }

        #endregion
    }


Die Liste registerList speichert alle Register (Tagpages) und die Register selbst speichern noch Blöcke (Panels)! Ich glaube ich brauche wirklich noch eine Datenklasse die mir alle wichtigen Daten speichert!

Hast du eine Idee wie ich diese 3 Formklassen Dialog, Register und Block mit Datenklassen verknüpfen kann?!

mfg Qualle7


danielf - Fr 05.03.10 12:40

Naja, du willst ja Daten anzeigen bzw. verarbeiten. Dafür machst du normal erst ein Daten-Objekt und dieses Daten-Objekt übergibst du dann deinem Control, welches es anzeigt bzw. zur Bearbeitung bereitstellt. Die letztendliche Struktur wie du das Objekt anzeigt, spielt zur Modellierung der Daten noch keine Rolle.

Beispiel:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
public class Person {
   public string Name;
   public string Vorname;
   public DateTime Birthday;

   public List<Auto> _autos;
   public List<Haus> _Haus;
}


So hast du nun die Person deklariert... nun brauchst du einfach ein Control welches die Person anzeigt.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public class PersonUC : UserControl {
    private Person _person;
    public Person Person { 
        get { return _persn; }
        set { _person = value; ShowPerson(_persn); }
    }
}


In der ShowPerson musst du nun die Zuordnung machen von Name, Vorname und Geburtstag und ggfs. die Autos und Häuser anzeigen. Ich nehme für einfache Typen oft ein Databinding an ein Label, etc.

Die Daten speichern kannst du dann einfach wie du bereits machst mit dem XmlSerializer.


Qualle7 - Fr 05.03.10 21:43

Entschuldige die späte Antwort!

Vielen Dank für deine Antwort! Ich werde das Ganze gleich ausbessern und so umsetzen!

Dankeschön für deine Hilfe.

mfg Qualle7