Entwickler-Ecke

IO, XML und Registry - XML Ser. überspringt Methode?


C# - Mi 18.01.12 22:29
Titel: XML Ser. überspringt Methode?
Hallo,

ich habe eine Methode in der ein XMLSerializer erzeugt wird der dann eine Klasse serialisieren soll. Jedoch wenn ich ihn instanziiere beendet überspringt das Programm einfach den Rest der Methode ohne irgendwelche Fehler zu melden.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
     public void SaveData()
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Options)); //Danach springt das Programm einfach zurück. Nächster Schritt wird NICHT ausgeführt
            XmlWriterSettings settings = new XmlWriterSettings
            {
                Indent = true,
                IndentChars = "\t"
            };
            XmlWriter writer = XmlWriter.Create("Data.xml", settings);
            serializer.Serialize(writer, this);
            writer.Close();
        }

von hier wird SaveData() aufgerufen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
        private void HandleFirstLaunch()
        {
            FolderBrowserDialog dialog = new FolderBrowserDialog
            {
                SelectedPath = ROOT + @"Data\",
                Description = "Wähle den Ordner, unter dem die Daten gespeichert werden sollen.",
            };
            DialogResult res = dialog.ShowDialog();
            if (res != DialogResult.OK) Close();
            manager.options.SavePath = dialog.SelectedPath;
          manager.SaveData();
        }

Und diese Methode wird von Form_Load() aufgerufen, welche dann ebenfalls übersprungen wird.
Hat jemand eine Lösung??


Th69 - Do 19.01.12 12:00

Hallo C#,

ich denke, da passen Quellcode und EXE nicht zueinander. Mach mal ein "Rebuild All" bzw. schau, ob du wirklich die richtige C#-Datei editierst...


Ralf Jansen - Do 19.01.12 12:09

Vermutlich wird eine Exception geworfen die du fangen und auswerten solltest. Form schluckt Exceptions im Load Event wenn man die nicht selbst behandelt.

Edit: Übrigens scheinst du im Load Event an irgendwelchen anderen Dialogen rumzuspielen (hier FolderBrowserDialog). Ganze schlechte Idee. Im Load Event ist der Besitzer des Focus eher undefiniert (die vorherige Form oder die jetzt gerade in Entstehung befindliche Form) und du kommst mit einem Dialog dazwischen der auch den Focus will. Ich vermute dein gezeigter Code wäre besser im Shown Event aufgehoben als in Load. Wenn man solchen Code schon in der Form unterbringt ist Shown eh meist der geeignetere Event.


C# - Do 19.01.12 17:51

Ok ich habs jetzt in die Shown() Mehtode gepackt, da erhalte ich beim erzeugen des Serializer (1. Zeile, 1. Post) die Fehlermeldung: "Fehler beim Refrektieren des Typs Options"

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    public class Options
        {
            public string SavePath { get; set; }
            public string Name { get; set; }
            //public string Password { get; set; }
            public List<FileInfo> FileInfos { get; set; }
            public List<UserData> UserData { get; set; }
        }


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
 public class FileInfo
    {
        public string Name { get; set; }
        public string Path { get; set; }
        public string Comment { get; set; }
    }

    public struct UserData
    {
        public string Name { get; set; }
        public IPAddress Ip { get; set; }
    }

Woran kann das liegen?


C# - Do 19.01.12 18:21

Ich habe das Problem gerade gelöst. Scheinbar kann man die Klasse "IPAddress" nicht serialisieren...

C#-Quelltext
1:
2:
3:
4:
5:
    public struct UserData
    {
        public string Name { get; set; }
        public IPAddress Ip { get; set; }
    }

Hab statt IPAddress jetzt einfach string genommen und jetzt geht es auch...


Ralf Jansen - Do 19.01.12 18:50

IPAddress hat keinen Standardkonstruktor (parameterlos). Der ist notwendig beim deserialisieren.