Laden...

Deserialisierung mit XmlSerializer erzeugt doppelte Einträge

Erstellt von Ammojack vor einem Jahr Letzter Beitrag vor einem Jahr 544 Views
A
Ammojack Themenstarter:in
5 Beiträge seit 2022
vor einem Jahr
Deserialisierung mit XmlSerializer erzeugt doppelte Einträge

Hallo liebe Gemeinde 😉
Die Klasse Spielsettings hab ich mittels XmlSerializer in eine Datei serialisiert. Nun möchte ich die Spielsettings wieder deserialisieren, und lese in Zeile 10 die Datei aus. Jetzt hab ich somit aber nochmal so viele Einträge in meiner CmbBestOfLegs Collection drin. Es scheint so, als würden die Spielsettings beim Auslesen nicht überschrieben werden, sondern addiert. Merkwürdiger weise würde es mit dem JasonSerializer aus Zeile 11 gehen. Im Konstruktor sollen Standardwerte gesetzt werden, falls eine neue Datei angelegt werden muss. Da mir das XML Format aber lieber ist als Datei, wäre ich euch dankbar für einen Tip bei meinem Problemchen.
Vielen Danke schonmal im voraus


        public static Spielsettings Load(string dateipfad, string dateiname)
        {
            Spielsettings spielsettings = new Spielsettings();
          
            XmlSerializer xml = new XmlSerializer(typeof(Spielsettings));
            FileStream fs = new FileStream(dateiname, FileMode.Open);

            try
            {
                spielsettings = (Spielsettings)xml.Deserialize(fs);
                //spielsettings = (Spielsettings)JsonSerializer.Deserialize(fs, typeof(Spielsettings));
            }
            catch (Exception ex)
            {
                
            }
            fs.Close();
            fs.Dispose();
            return spielsettings;
        }


    public class Spielsettings : ObservableObject
    {
        //public event EventHandler Auswechselspieler_Change;
        
        public Spielsettings()
        {
            CmbBestOfLegs = new ObservableCollection<string>
            {
                "3",
                "5",
                "7",
                "9"
            };
        }

        public ObservableCollection<string> CmbBestOfLegs { get; private set; }

        private int bestOfLegs;
        public int BestOfLegs
        {
            get 
            { 
                return bestOfLegs; 
            }
            set 
            { 
                bestOfLegs = value; 
            }

    }

4.931 Beiträge seit 2008
vor einem Jahr

Du erzeugst ja auch im Konstruktor von Spielsettings diese initiale Liste, und beim Deserialisieren werden dann die Daten aus der Datei hinzugefügt (kannst ja mit dem Debugger überprüfen, ob während des Deserialisierens der Konstruktor aufgerufen wird).
Am besten, du erzeugst diese Liste von außerhalb und übergibst sie dann dieser Klasse (z.B. durch einen weiteren Konstruktor mit Parameter).

PS: Daher ist auch die Zuweisung = new Spielsettings(); überflüssig (da direkt folgend die Deserialize-Methode aufgerufen wird und dieses Objekt wieder vom GC entsorgt wird).
PPS: Außerdem solltest du die using-Anweisung benutzen (anstatt manuellem Close() und Dispose()).

A
Ammojack Themenstarter:in
5 Beiträge seit 2022
vor einem Jahr

Danke für die Hilfe 🙂
Das mit der Using Anweisung schau ich mir nochmal an, ist ein guter Tip.
Das der Konstruktor aufgerufen wird und die Standardwerte gesetzt werden hatte ich im Debugger gesehen. Aber warum er das Verhalten an den Tag legt hatte ich nicht verstanden. Denn eigentlich ist das doch eine Zuweisung, oder nicht?


spielsettings = (Spielsettings)xml.Deserialize(fs);

Weise der spielsettings den Inhalt aus der Textdatei zu, und nicht addiere.

Aber nu gut. Muss ich mir wohl eine andere Lösung auf Deinen Rat hin überlegen müssen 🙁

G
154 Beiträge seit 2015
vor einem Jahr

Danke für die Hilfe 🙂
Denn eigentlich ist das doch eine Zuweisung, oder nicht?

Weise der spielsettings den Inhalt aus der Textdatei zu, und nicht addiere.

Kann er aber nicht, weil der setter private ist.
Bei nicht überschreibbaren Properties wird wohl standardmäßig nach einer Add-Funktion gesucht, um die Werte zu setzen.

S
39 Beiträge seit 2019
vor einem Jahr

Anhand der Variablenbezeichnung drängt sich mir der Gedanke auf, dass wir an ähnlichen Projekten arbeiten ?!?. Ich mach grad was für Darts.

2 stupid 4 chess? No way.
2 stupid 4 C#? It seems so X(

A
Ammojack Themenstarter:in
5 Beiträge seit 2022
vor einem Jahr

Anhand der Variablenbezeichnung drängt sich mir der Gedanke auf, dass wir an ähnlichen Projekten arbeiten ?!?. Ich mach grad was für Darts.

Ja, da hast du recht. Es wird ein Ligaprogramm. Gut kombiniert 😉

4.931 Beiträge seit 2008
vor einem Jahr

(Meinst du dann nicht eher BestOfLeagues, statt BestOfLegs? Oder interessieren dich eher die Beine der Spieler? 🙂){dimgray}

16.806 Beiträge seit 2008
vor einem Jahr

Ein "Leg" im Dart ist ein "Durchgang". Also ein Spiel zB 501.
Mehrere Legs ergeben ein Set.
Ein oder mehrere Sets ergeben ein Match (zB zwischen zwei Personen).

4.931 Beiträge seit 2008
vor einem Jahr

Da stand ich wohl auf dem Schlauch - hatte einfach nur Liga übersetzen wollen.

Darfst gerne diesen und den vorherigen Beitrag wieder löschen - oder zur Belustigung stehenlassen. 🙂

Edit: Dafür habe ich jetzt meinen 4500. Beitrag hier geschrieben, juhu!

S
39 Beiträge seit 2019
vor einem Jahr

Ein "Leg" im Dart ist ein "Durchgang". Also ein Spiel zB 501.
Mehrere Legs ergeben ein Set.
Ein oder mehrere Sets ergeben ein Match (zB zwischen zwei Personen).){gray}

Leider gibt es auf der Profi - Tour nur zwei Turniere, die im Set - Modus gespielt werden. Den World Grand Prix und die bald anstehende Weltmeisterschaft, zu der ich am nächsten Mittwoch aufbreche. Leider nur als Zuschauer / Unterstützer meines Freundes, der bei der diesjährigen Ausgabe wieder mitspielt.

Edit: Dafür habe ich jetzt meinen 4500. Beitrag hier geschrieben, juhu!

Lass Dir dazu von mir herzlich gratulieren.

2 stupid 4 chess? No way.
2 stupid 4 C#? It seems so X(