Entwickler-Ecke

IO, XML und Registry - XML Fehler beim Reflektieren des Typs


BCT1 - Fr 22.10.10 18:40
Titel: XML Fehler beim Reflektieren des Typs
Ich hab folgendes Problem mit dem XML-Serializer. Ich hab ein Objekt dass ich speichern will. Die Klasse des Objekts hab ich hier etwas vereinfacht, aber sieht etwa so aus:

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:
[Serializable]
public class Daten
{
    public int wert1;
    public int wert2;
    public Wert wert3;
    
    public void Save(Daten objekt)
    {
        // Get the path of the save game
        string fullpath = @"C:\Neuer Ordner\Save.sav";

        // Open the file, creating it if necessary
        File.Delete(fullpath);
        FileStream stream = File.Open(fullpath, FileMode.OpenOrCreate);
        try
        {
            // Convert the object to XML data and put it in the stream
            XmlSerializer serializer = new XmlSerializer(typeof(Daten));
            serializer.Serialize(stream, objekt);
        }
        finally
        {
            // Close the file
            stream.Close();
        }
    }
}
[Serializable]
public class Wert
{
    public int wert;
    public Wert(int wert1, int wert2, int wert3)
    {
        wert = wert1 + wert2 + wert3;
    }
}


Ich erstelle also ein neues Objekt von "Daten" und weise "wert3" ein "Wert"-Objekt zu. Wenn ich jetzt speichern will kommt der Fehler:
"Fehler beim Reflektieren des Typs 'ConsoleApplication1.Daten'."
Ich hab rausgefunden, dass es an dem Konstruktor der Klasse "Wert" liegt, denn wenn ich den wegmache klappt alles. Das Problem ist aber, dass ich den Konstruktor brauche, da ich mir durch ihn viel Arbeit spare.
Kann man es irgendwie hinkriegen, dass es mit Konstruktor funktioniert?

Gruß


Ralf Jansen - Fr 22.10.10 19:19

Der Serializer braucht einen parameterlosen Konstruktor für die zu serialisierende Klasse. Ein Klasse ohne definierten Konstruktor bekommt einen implizit vom Compiler verpasst, da er ja sonst nicht zu erzeugen wäre. Sobald du aber einen eigenen anderen Konstruktor definierst bekommt die Klasse keinen automatischen parameterlosen Konstruktor da der Typ ja jetzt einen ~offiziellen~ Weg hat um erzeugt werden zu können.

Lange Rede kurzer Sinn. Du musst deiner Klasse noch selbst einen eigenen parameterlosen Konstruktor verpassen.


BCT1 - Fr 22.10.10 19:36

Jetzt geht es! Danke

-BCT1