C# Struktur-Instanz in datei speichern

kabbesman

Cadet 1st Year
Registriert
Okt. 2006
Beiträge
13
Hallo Leut
ich hab Folgendes problem:
ich hab ein programm geschrieben, bei dem viele daten vom benutzer eingegeben werden und in einer Instanz einer struktur gesopeichert werden. es gibt ne verkettete liste mit diesen Instanzen drin, um sie alle beisammen zu haben ;-)
jetz würd ich gerne diedie komplette liste bzw die struktur-instanzen so in ne datei schreiben, dass ich nach neustart des programms nich die struktur wieder "befüllen" muss, also jeden member einzeln, sondern einfach die instanz aus der datei ner leeren instanz im programm wie eine einzige variable übergeben kann.
is das möglich?
LG Tobi
 
Puh, ich hoffe das ich dich richtig verstehe.

Ja , du kannst das serializieren.

Ich vermute du hast eine Collection, vom Typ deiner sructuren?

Suche mal im internet nach serializieren collections...


hoffe konnte dir ein wenig helfen
 
@olampl
danke für den tipp, ich habe ein beispiel bei der msdn gefunden ( msdn-Beispiel). die frage is nur, wie das mit mehreren elementen funktioniert, da im beispiel nur eine instanz einer klasse gestreamt wird.

@lordfritte
danke abba das beispiel hat mich etwas verwirrt ^^
 
Einfach die Objekte hintereinander mit dem selben Stream Objekt übergeben.

Auf die Reihenfolge muss natürlich geachtet werden.

Code:
static void Main(string[] args)
        {

            string pfadname = @"c:\Tempdatei.tmp";
            FileStream fs;

            //Erzeugen der Daten
            BeispielClass bc = new BeispielClass();
            BeispielClass bc2 = new BeispielClass();

            bc.x = 10;
            bc.y = 15;
            bc2.x = 200;
            bc2.y = 400;

            // Daten werden in Datei gespeichert
            using (fs = new FileStream(pfadname, FileMode.Create))
            {
                SaveMe(fs, bc);
                SaveMe(fs, bc2);
            }

            private static void SaveMe(FileStream fs, object obj)
        {
            BinaryFormatter binform = new BinaryFormatter();
            binform.Serialize(fs, obj);

        }
           // Um die Daten wieder zu laden:
           public static object LoadMe(FileStream fs)
        {
            BinaryFormatter binform = new BinaryFormatter();

            Object dataobj = binform.Deserialize(fs);
            return dataobj;

        }
}


[Serializable()]
    class BeispielClass
    {
        public int x = 100;
        public int y = 350;

        public BeispielClass(int x_Wert, int y_Wert)
        {
            x = x_Wert;
            y = y_Wert;

        }

        public BeispielClass()
        {


        }
    }
 
Zuletzt bearbeitet:
danke für das code-beispiel, ich werds gleich versuchen.
nur: wie bekomme ich aus dem dataobj die beiden einzelnen variablen wieder raus? ^^
 
Zum Beispiel so:

Code:
            BeispielClass bc3 = new BeispielClass();
            BeispielClass bc4 = new BeispielClass();

            using (fs = new FileStream(pfadname, FileMode.Open))
            {
                bc3 = (BeispielClass)LoadMe(fs);
                bc4 = (BeispielClass)LoadMe(fs);
            }

            Console.WriteLine(bc3.x + " und " + bc3.y);
            Console.WriteLine(bc4.x + " und " + bc4.y);
            Console.Read();
 
Zuletzt bearbeitet:
des is ja einfacher als ich dachte :-)
jetz muss es nur noch mit strukturen funktionieren :-P
ahh und eine kleine frage noch... wenn ich nich weiß, wie viele objekte sind, wie lese ich dann am idealsten alle aus der datei aus?
also wie is die abbruchbedingung für die schleife
 
Nimm einfach den XMLSerializer.

Damit musst du nur das serialisieren der Klasse definieren. (Bei einer Collection mit foreach)

Wahlweise ist es auch moeglich, das du das XML manuell erstellst und dann via XSD.exe zuerst ein schema erstellst und dasraus eine Class.

Falls cih was unklar beschreiben habe, einfach nochmal fragen
 
kabbesman schrieb:
des is ja einfacher als ich dachte :-)
jetz muss es nur noch mit strukturen funktionieren :-P
ahh und eine kleine frage noch... wenn ich nich weiß, wie viele objekte sind, wie lese ich dann am idealsten alle aus der datei aus?
also wie is die abbruchbedingung für die schleife


Du kannst natürlich auch mit dem XMLSerializer arbeiten.

Sonst kannst es so versuchen:

Code:
            List<BeispielClass> bcA = new List<BeispielClass>();

            using (FileStream fs = new FileStream(pfadname, FileMode.Open))
            {

                while (fs.Position < fs.Length)
                {
                        bcA.Add((BeispielClass)LoadMe(fs));
                }

            }

            foreach (BeispielClass bc_item in bcA)
            {
                Console.WriteLine(bc_item.x);
            }
            Console.Read();
 
Zuletzt bearbeitet:
soo ich meld mich auch mal wieder^^
aalso ich habs jetz ohne XML Serializer gemacht und es funktioniert soweit ich das im moment beurteilen kann wunderwar
viielen dank un nen schönen tag noch
LG Tobi
 
Zurück
Oben