Laden...

Klasse in Datei schreiben und lesen

Erstellt von kstanger vor einem Jahr Letzter Beitrag vor einem Jahr 466 Views
K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr
Klasse in Datei schreiben und lesen

Hallo allerseits,

gibt es in C# etwas, um Klassen in eine Datei zu schreiben? Ich habe eine Klasse mit Daten (Strings, Bytes, Integers schön gemischt) und möchte diese speichern und dann auch wieder lesen. Irgendwie habe ich bisher noch nichts passendes gefunden.
Kann mir jemand helfen?

Karl Stanger
190 Beiträge seit 2012
vor einem Jahr

Ja natürlich. Es gibt da viele Wege. Hier mal was als Einstieg: Serialisierung in .NET

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

Danke für den Hinweis. Ich habe das jetzt mit BinaryFormatter gelöst.

Karl Stanger
D
152 Beiträge seit 2013
vor einem Jahr

Du hast den Hinweis zum BinaryFormatter gelesen?

BinaryFormatter ist unsicher und kann nicht sicher gemacht werden. Weitere Informationen finden Sie im BinaryFormatter-Sicherheitshandbuch.

Deserialisierungsrisiken in der Verwendung von BinaryFormatter- und verwandten Typen

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

Das habe ich gelesen. Meine Anwendung ist aber für den Privatgebrauch und beinhaltet zudem keine sensible Daten. Daher denke ich, dass BinaryFormatter für meine Anwendung ok ist.

Karl Stanger
T
2.219 Beiträge seit 2008
vor einem Jahr

Auch zu beim BinaryFormatter zu beachten, dass bei Änderungen an deiner Klasse die bestehenden Dateien nicht mehr deserialisiert werden können.
Du musst dann selbst für Kompatibilität sorgen z.B. duch Versionierung durch Vererbung.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.806 Beiträge seit 2008
vor einem Jahr

Meine Anwendung ist aber für den Privatgebrauch

Du liest das falsch.
Da steht inhaltlich nicht "Hey, unsicher, aber für Privatgebraucht okay" sondern "BinaryFormatter sollte nicht mehr verwendet werden, ausser in Ausnahmen".
Und zwar sehr sehr deutlich.

T
2.219 Beiträge seit 2008
vor einem Jahr

@Abt
Steht auch so in der Doku:

Der Typ ist gefährlich und wird nicht für die BinaryFormatter Datenverarbeitung empfohlen.
++Anwendungen sollten so bald wie möglich aufhören, BinaryFormatter zu verwenden, auch wenn Sie der Auffassung sind, dass die verarbeiteten Daten vertrauenswürdig sind. ++
BinaryFormatter ist unsicher und kann nicht sicher gemacht werden.

Quelle:
Deserialisierungsrisiken in der Verwendung von BinaryFormatter- und verwandten Typen

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

ok, ich werde den BinaryFormatter nicht benutzen. Aber was ist dann die nächste (naheliegende) Variante? Was wird von Euch empfohlen?

Karl Stanger
16.806 Beiträge seit 2008
vor einem Jahr

Steht im Serialisierungsartikel: XML oder Json - außer, Du hast besondere Anforderungen.

T
2.219 Beiträge seit 2008
vor einem Jahr

Wenn ich wählen könnte würde ich fast immer zu Json greifen.
Ist gerade bei komplexen Strukturen kompakter als XML.

Hier solltest du dich in die Formate einlesen und für dich entscheiden welches dir besser passt.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

Jetzt probiere ich Json und laufe prompt auf einen Fehler:


using System.Text.Json;

Json ist im Namespace von System.Text nicht vorhanden. Wie muss ich denn das vereinbaren?

Karl Stanger
K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

So, es funktioniert mit Json. Hier der Code mit ein paar Testdaten.


       private void ButtonRGBLesen_Click(object sender, EventArgs e)
        {
            string jsonString = File.ReadAllText(Globals.fileNameRGB);
            Farbe[] Farben = JsonSerializer.Deserialize<Farbe[]>(jsonString);
            MessageBox.Show(Globals.fileNameRGB + " gelesen");

            MessageBox.Show(Farben[0].Beschreibung);
            MessageBox.Show(Farben[1].Beschreibung);
            MessageBox.Show(Farben[2].Beschreibung);
            MessageBox.Show(Farben[3].Beschreibung);
        }

        private void ButtonRGBSpeichern_Click(object sender, EventArgs e)
        {
            Farben = new Farbe[]
            {
                new Farbe (0, 255, 255, 255, "weiß"),
                new Farbe (1, 255, 0, 0, "rot"),
                new Farbe (2, 0, 255, 0, "grün"),
                new Farbe (3, 0, 0, 255, "blau")
            };
            string jsonString = JsonSerializer.Serialize(Farben);
            File.WriteAllText(Globals.fileNameRGB, jsonString);
            MessageBox.Show("Farben in " + Globals.fileNameRGB + " gespeichert");
        }


Ist das so ok? Oder habe ich wichtige Dinge nicht berücksichtigt?

Karl Stanger
16.806 Beiträge seit 2008
vor einem Jahr

Wir können nur antworten: sieht so aus, dass es kompilieren könnte.
Ob die Struktur passt, können wir Dir nicht sagen, das musst selbst wissen.

Kann evtl nur das Feedback geben: willst wirklich für jedes Setting ne eigene Datei haben?
Dir ist schon bewusst, dass Windows Forms (wie alle .NET App Runtimes) auch eine eingebaute Settingsverwaltung hat? Schon mal in die Docs geschaut?
Application Settings - Windows Forms .NET Framework

Und wenn ich sowas seh Globals.fileNameRGB, dann weiß ich, dass da strukturell was nicht stimmt 🙂
Globale Klassen sind ein deutliches Zeichen für einen Fehler im Code Aufbau.

Aber wenn es nur ein Mini Tool für Dich ist, dann tuts Dir wahrscheinlich auch nicht weh.