Entwickler-Ecke

IO, XML und Registry - Liste von Objekten wird nicht richtig serialisiert


Csharp-programmierer - Do 29.12.16 21:39
Titel: Liste von Objekten wird nicht richtig serialisiert
Hallo Forum,
ich bin gerade dabei, ein kleines Programm zu schreiben. Dafür habe ich drei Klassen.

Klasse 1: enthält alle wichtigen Eigenschaften (fast nur Strings)

C#-Quelltext
1:
2:
3:
4:
5:
6:
 public class IdeenProperties
    {
        public string Ideenname { get; set; }
        public string Ideenbeschreibung { get; set; }
        public int Priorität { get; set; }
    }


Klasse 2: enthält eine Liste vom Typ der Klasse 1 und Methoden, die diese Liste speichern und öffnen

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:
public class IdeenSerialisation
    {
        public List<IdeenProperties> IdeenProperties { get; set; }
        public IdeenSerialisation()
        {
            IdeenProperties = new List<Entwicklertool.IdeenProperties>();
        }

        public void Speichern(string Pfad)
        {
            try
            {
                using (FileStream file = new FileStream(Pfad, FileMode.Create))
                {
                    XmlSerializer xml = new XmlSerializer(typeof(IdeenSerialisation));
                    xml.Serialize(file, this);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        public static IdeenSerialisation Laden(string Pfad)
        {
            try
            {
                using (FileStream file = new FileStream(Pfad, FileMode.Open))
                {
                    XmlSerializer xml = new XmlSerializer(typeof(IdeenSerialisation));
                    return (IdeenSerialisation)xml.Deserialize(file);
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
                return null;
            }
        }
    }

Klasse 3: hier kann der Benutzer verschiedene Daten angeben. Als erstes wird ein Objekt von IdeenSerialisation erstellt und im Konstruktor wird dann diesem Objekt ein Wert hinzugefügt durch die Methode Öffnen. Wenn das Objekt leer ist, also wenn keine XML Datei existiert, dann wird einfach ein neues Objekt instantiert.
So, wenn ich jetzt dieser Liste ein neues Objekt mit zugebe und dann die Speichern Methode ausführe, passiert nichts, die XML Datei sieht dann so aus:


XML-Daten
1:
2:
3:
4:
<?xml version="1.0"?>
<IdeenSerialisation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <IdeenProperties />
</IdeenSerialisation>


Woran kann das liegen?


Christian S. - Do 29.12.16 22:04

Zeig bitte auch die relevanten Teile von Klasse 3.


Csharp-programmierer - Do 29.12.16 22:08

Ah okay, sorry:


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:
ublic partial class Ideen : UserControl
    {
        IdeenSerialisation _ideen { get; set; }
        public Ideen()
        {
            InitializeComponent();
            AddItems();
        }

        private void AddItems()
        {
            try
            {
                _ideen = IdeenSerialisation.Laden(Path.Combine(Datenfunktionen.ProjektPfad, "ideas.xml"));        //Pfad der Datei
                int CurrentPosition = 0;

                if (_ideen != null)
                {
                   // ....
                }
                else
                {
                    _ideen = new IdeenSerialisation();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void pictureButton1__click()
        {
                int i = 0;
                IdeenProperties prop = new IdeenProperties()
                {
                    Ideenbeschreibung = this.textBox1.Text,
                    Ideenname = this.textBox2.Text,
                    Priorität = i
                };
                // Idee hinzufügen
                _ideen.IdeenProperties.Add(prop);
                IdeenSerialisation ser = new IdeenSerialisation();
                ser.Speichern(Path.Combine(Datenfunktionen.ProjektPfad, "ideas.xml"));
        }
    }


FinnO - Do 29.12.16 22:37

Moin,

Es könnte helfen, der IdeenSerialisation die sog. IdeenProperties die du vorher mühsam erstellt hast, auch zuzuweisen. Du hast ja nun extra dafür die Property IdeenProperties in deiner Serialisierungsklasse vorgesehen, die müsste man dann entsprechend nutzen. Nur weil die beiden Variablen zufällig gleich heißen, sind sie ja noch lange nicht identisch :idea:.

Gruß
Finn


Csharp-programmierer - Do 29.12.16 23:40

Wie genau soll ich das verweisen?


Christian S. - Do 29.12.16 23:55

Willst Du uns verarschen? Entschuldige die Wortwahl, aber anders kann ich das echt nicht mehr fragen. Nach Über 600 Beiträgen in diesem Forum fragst Du, wie man eine Zuweisung an ein Feld macht?

Ich lege Dir ganz, ganz dringend nahe, Grundlagen zu lernen und nicht nur immer Programme zusammen zu stoppeln, ohne zu verstehen, was dort eigentlich passiert. Ich werde mir das nicht mehr lange angucken, denn Deine Weigerung selbstständig zu lernen, verprellt langsam andere Benutzer.


Csharp-programmierer - Fr 30.12.16 00:08

Sorry, ich habe jetzt die ganze Zeit den Fehler gesucht, der so offensichtlich war. Jetzt funktionierts, aber trotzdem danke