C# Auflistung einer Klasse

second.name

Lieutenant
Registriert
Sep. 2009
Beiträge
691
Hallo Forum,
in gezeigter, exemplarischer Klasse "Einstellungen" (welche ich auch bereits serialisiere), möchte ich jetzt noch eine Auflistung der Klasse "Person" hinzufügen und mit serialisieren.
Frage: wie macht man das am "einfachsten", bzw. ist der Umweg über die Vererbung von ": Collection<Person>" notwendig?

...Vielleicht eine Dumme frage, aber ich finde den roten Faden nicht. :(

Code:
public class Einstellungen
{
    public Einstellungen()
    {
        Einstellung1 = 11;
        Einstellung2 = 22;
        //hier möchte ich gern noch eine Auflistung von "Person" hinzufügen (Anzahl umbekannt)
    }

    public int Einstellung1 { get; set; }

    public int Einstellung2 { get; set; }
}

public class Personen : Collection<Person>
{
    public Personen() { }
}

public class Person
{
    public Person()
    {
        Name = "Mustermann";
        Alter = 50;
    }

    public string Name { get; set; }

    public int Alter { get; set; }
}
 
Einfach eine weitere Property:
Code:
public List<Person> Personen { get; set; }

bzgl. der Serialisierung muss dann "Person" ebenfalls [Serializable] sein.
 
Kurz und knackig - super und vielen Dank. :)
Ergänzung ()

Muss doch nochmal etwas fragen:

Wenn ich auch "Person" im Konstruktor von "Einstellungen" initialisieren möchte, werden beim Deserialisieren von "Einstellungen" immer die deserialisierten und im Konstruktor initialisierten Werte in List<> aufgenommen. ...Damit habe ich immer zuviel Elemente in List<>.

(Bei Wertetypen z.B. "Einstellung1" wird der Wert ja einfach beim deserialisieren überschrieben, bei Referenztypen aber in List<> hinzugefügt.)

Ist sicher auch nix Schwieriges, aber ich weiß z.Z. nicht wie ich's löse...

Code:
        public Einstellungen() //Konstruktor
        {
               Einstellung1 = 11;
               Einstellung2 = 22; 
               Personen = new List<Person>();
               for (int i = 0; i < 5 - 1; i++) //fünf "Standard-Personen" der Liste hinzufügen 
               {
                      Personen.Add(new Person());
               }
        }
 
Du musst den Konstruktor ohne Parameter leer lassen, bzw nur nutzen um Variablen zu initialisieren (z.B. die Liste), jedoch keine Daten hinzufügen, da es dieser ist, der vom Serializer genutzt wird um dein Object zu erstellen und anschließend die Daten anfügt.

Code:
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Einstellungen einstellungen = new Einstellungen();
            einstellungen.Einstellung1 = 100;
            einstellungen.Einstellung2 = 200;

            var person1 = new Person("first.name", 100);
            var person2 = new Person("second.name", 100);

            einstellungen.Personen.Add(person1);
            einstellungen.Personen.Add(person2);

            var serializer = new XmlSerializer(typeof(Einstellungen));

            var serializedEinstellungenStream = new MemoryStream();
            serializer.Serialize(serializedEinstellungenStream, einstellungen);
            serializedEinstellungenStream.Seek(0, SeekOrigin.Begin);

            var deserializedEinstellungen = serializer.Deserialize(serializedEinstellungenStream) as Einstellungen;
        }
    }

    [Serializable]
    public class Einstellungen
    {
        [NonSerialized]
        private List<Person> personen = new List<Person>();
        [NonSerialized]
        private int einstellung1 = 1;
        [NonSerialized]
        private int einstellung2 = 2;

        public List<Person> Personen { get { return personen; } set { personen = value; } }
        public int Einstellung1 { get { return einstellung1; } set { einstellung1 = value; } }
        public int Einstellung2 { get { return einstellung2; } set { einstellung2 = value; } }
    }

    [Serializable]
    public class Person
    {
        public string Name { get; set; }
        public int Alter { get; set; }

        public Person()
        {
        }

        public Person(string name, int alter)
        {
            Name = name;
            Alter = Alter;
        }
    }
}
 
Zuletzt bearbeitet:
Vielen Dank für die ausführliche Antwort - hat super geklappt.

...Bis zur nächsten Frage. ;)
 
Zuletzt bearbeitet:
Zurück
Oben