Speichern einer "List" die Objecte meiner Struct enthält

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Speichern einer "List" die Objecte meiner Struct enthält

    Moin,

    glaube der Titel ist ein wenig verwirrend :P

    Ich habe folgende Structure:

    C#-Quellcode

    1. public struct Infos
    2. {
    3. public int id;
    4. public string vid_link;
    5. public string img_link;
    6. }


    Ich habe dann noch eine List mit dem Typ Infos:

    C#-Quellcode

    1. List<Infos> AllInfos = new List<Infos>();


    Nun suche ich eine gute und auch performante Lösung diese Liste zu speichern und wieder zu laden.
    Die Liste wird Praktisch alle 2-5 Minuten immer größer.
    Da ich aber logischer weise alle Einträge nach Programm Neustart wieder verlieren suche ich wie gesagt eine Lösung diese Liste
    performant zu speichern / laden.

    Habt ihr da ein paar Anhaltspunkte die mich da weiter bringen ?

    Grüße
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Hallo du mit dem komplizierten Namen,

    erstell eine Klasse die deine Liste mit der Strukture enthält.
    Diese dann wie im Link Serialisieren.

    msdn.microsoft.com/de-de/library/4abbf6k0(v=vs.120).aspx
    Gruss

    mikeb69
    @mikeb69 Jou.
    @xChRoNiKx Mach aus der Struct eine serialisierbare Klasse. Gugst Du dann hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @mikeb69
    So kompliziert ist er ja garnicht ^^
    Danke für den Link werd ich mir gleich mal anschauen.

    @RodFromGermany
    Schau ich mir auch an. Gehe aber mal davon aus das beides auf das gleiche hinaus läuft.

    Melde mich dann nochmal zurück wenn ich da was gebastelt habe.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Definiere

    xChRoNiKx schrieb:

    auf das gleiche
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Ich meine das ihr beide mir etwas zu Serialisierung geschrieben habt ;)
    Ausserdem hab ich mir dein Thema angeschaut und versucht es nachzubauen.
    Problem an der Sache war ich möchte ja nicht die Klasse an sich sondern eine
    List<MeinTyp> speichern.
    Hab es ergo nicht hinbekommen das umzubauen. Bin da auch gerne offen für weitere Tipps wie ich
    das ganze mit einer Liste mache.

    @mikeb69
    Der MSDN Link hatte es in sich ^^
    Hab mir daraus nun Laden/Speichern gebastelt (das geht ja richtig flott 8| also das speichern und laden an sich)

    Ich hab also quasi nun folgendes:
    Die Klasse

    C#-Quellcode

    1. [Serializable]
    2. public class Infos
    3. {
    4. public int id { get; set; }
    5. public string vid_link { get; set; }
    6. public string img_link { get; set; }
    7. }


    Und diese 2:

    C#-Quellcode

    1. public void WriteData()
    2. {
    3. DateTime rDate = DateTime.Now;
    4. string filename = String.Format("{0:d.M.yyyy}.bin", rDate);
    5. IFormatter formatter = new BinaryFormatter();
    6. Stream stream = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
    7. formatter.Serialize(stream, AllInfos); //AllInfos ist eine Global deklarierte List<Infos> AllInfos = new List<Infos>();
    8. stream.Close();
    9. label2.Text = "Speichern abgeschlossen"; //ist nur ne testanwendung deshalb keine control bennenung ;)
    10. }
    11. public void LoadData()
    12. {
    13. DateTime rDate = DateTime.Now;
    14. string filename = String.Format("{0:d.M.yyyy}.bin", rDate);
    15. IFormatter formatter = new BinaryFormatter();
    16. Stream stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
    17. AllInfos = (List<Infos>) formatter.Deserialize(stream); //AllInfos ist eine Global deklarierte List<Infos> AllInfos = new List<Infos>();
    18. stream.Close();
    19. label2.Text = "Laden abgeschlossen"; //ist nur ne testanwendung deshalb keine control bennenung ;)
    20. }


    Ausserdem habe ich mir gedacht ich kann die Daten ja auch per Tag abspeichern deshalb nun auch das Datum mit eingebaut.
    So wird die List nicht RIESEN groß sondern ist auch schön strukturiert nach Tag geordnet (um darauf zuzugreifen usw)
    Nehme auch immer gerne noch weitere Tipps an. Für das Problem an sich ist ja eine Lösung gefunden deshalb
    setzte ich auf erledigt.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    @xChRoNiKx,

    hab dir mal was in C# gebastelt.

    Die Form - ohne Button und alles

    C#-Quellcode

    1. using System;
    2. using System.IO;
    3. using System.Runtime.Serialization;
    4. using System.Runtime.Serialization.Formatters.Binary;
    5. using System.Windows.Forms;
    6. namespace WindowsFormsApplication2
    7. {
    8. public partial class Form1 : Form
    9. {
    10. public Form1()
    11. {
    12. InitializeComponent();
    13. }
    14. private void Form1_Load(object sender, EventArgs e)
    15. {
    16. Class1 c = new Class1();
    17. IFormatter formatter = new BinaryFormatter();
    18. Stream stream = new FileStream("MyFile.xml", FileMode.Create, FileAccess.Write, FileShare.None);
    19. formatter.Serialize(stream, c);
    20. stream.Close();
    21. }
    22. }
    23. }

    Hier die Klasse welche serialisiert werden soll.

    C#-Quellcode

    1. using System;
    2. namespace WindowsFormsApplication2
    3. {
    4. [Serializable]
    5. class Class1
    6. {
    7. private int id;
    8. private string test;
    9. public Class1()
    10. {
    11. this.id = 0;
    12. this.test = "test";
    13. }
    14. }
    15. }


    Gruss

    mikeb69

    xChRoNiKx schrieb:

    ich möchte ja nicht die Klasse an sich sondern eine
    List<MeinTyp> speichern.
    Dann mach Dir eine seerialisierbare Klasse, deren Member eine List<MeinTyp> ist. Damit hast Du absolut keine Probleme.
    Wenn Du dieser Klasse später weitere Member hinzufügst, kannst Du alte Daten problemlos laden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!