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?
Ja natürlich. Es gibt da viele Wege. Hier mal was als Einstieg: Serialisierung in .NET
Danke für den Hinweis. Ich habe das jetzt mit BinaryFormatter gelöst.
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
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.
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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
@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.
ok, ich werde den BinaryFormatter nicht benutzen. Aber was ist dann die nächste (naheliegende) Variante? Was wird von Euch empfohlen?
Steht im Serialisierungsartikel: XML oder Json - außer, Du hast besondere Anforderungen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
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?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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?
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code