Wie soll ich schreibgeschützte Daten für die Bereitstellung mit meiner Anwendung speichern?

17

Ich entwickle eine Desktop-Anwendung, für deren Ausführung einige Informationen erforderlich sind. Diese Informationen werden jedoch nicht geändert (die Daten müssen bei jeder Ausführung der App geladen werden, die Daten werden jedoch niemals geladen) geändert). Die Daten müssen auf demselben Computer gespeichert sein, auf dem die App ausgeführt wird (clientseitiger Speicher?).

Es ist auch besser, wenn der Benutzer diese Informationen nicht einfach ändern kann (vorausgesetzt, er verfügt nicht über ausreichende IT-Kenntnisse).

Wie soll ich solche Informationen speichern? Eine lokale Datenbank? XML, das mit der Anwendung gesendet wird?

Ich benutze WPF.

Appa yip yip
quelle
2
Dies ist kein Meta. Ein Meta ist eine Site, auf der Probleme oder Bedenken zu den wichtigsten Sites, an denen Fragen gestellt werden, besprochen werden.
jpmc26
1
Warum möchten Sie nicht, dass die Benutzer die Informationen ändern? Ist das ein Sicherheitsrisiko oder was? Sollen diese Informationen vor dem Benutzer geheim gehalten werden? Die Gründe könnten sich erheblich ändern, welche Antworten angemessen sind.
jpmc26
1
@ jpmc26 Nun, es ist eine Art Sicherheitsbedenken, aber es ist keine große Sache. Das Hauptziel der Anwendung ist die Kommunikation über eine serielle Schnittstelle mit einem Temperaturregler (wie diesem ). In der XML-Datei werden einige Informationen zu den Speicheradressen des Reglers gespeichert. Wenn der Benutzer es ändert, kann es zu Problemen bei der Ausführung kommen, daher möchte ich es vermeiden. Aber es ist nur eine Sorge, wie ich sagte, keine große Sache. ps: bearbeitete die Frage, um Meta für SE zu ersetzen . Vielen Dank.
Appa yip yip
2
Wenn Sie eine lokale Datenbank wünschen, werfen Sie einen Blick auf SQLite. (Aber wenn die Daten klein genug sind, um beim Start in den RAM geladen zu werden, bevorzuge ich eine einfach strukturierte Datei wie JSON oder etwas Binäres)
CodesInChaos
1
"Wenn der Benutzer dies ändert, kann dies zu Problemen bei der Ausführung führen. Daher möchte ich dies vermeiden." klingt überhaupt nicht nach Sicherheitsbedenken. Ein Sicherheitsproblem ist eines, bei dem die Datei eine Passphrase oder ähnliches enthält. Fügen Sie die Einstellungen einfach in eine XML-Datei neben die ausführbare Datei ein und schreiben Sie oben einen Kommentar mit der Aufschrift "Berühren Sie die Einstellungen in dieser Datei nicht !!". Wenn der Benutzer zufällige Dateien in Ihrem Installationsverzeichnis bearbeitet, hat er die erforderliche Brüchigkeit verdient.
Roger Lipscombe

Antworten:

14

Eine Binärdatei ist die naheliegende Antwort, hängt jedoch davon ab, wie Sie sie laden. Sie können sich das Leben auch leicht machen, wenn Sie können.

XML ist möglicherweise eine gute Wahl, da in C # integrierte Methoden zum Lesen vorhanden sind. Sie können eine Prüfsumme hinzufügen Ihren Daten , sodass die Prüfsumme nicht mehr übereinstimmt, wenn der Benutzer sie ändert (Sie müssen eine Prüfung hinzufügen, um sicherzustellen, dass die Prüfsumme gültig ist).

Eine lokale Datenbank kann weitere Probleme verursachen, da Sie andere Abhängigkeiten haben, die Sie benötigen, um darauf zugreifen zu können

Matt Wilko
quelle
Ich habe nicht über die Prüfsumme nachgedacht, es ist eine wirklich schöne Idee. Also erstelle ich eine Prüfsumme und speichere sie in meiner Anwendung. Jedes Mal, wenn ich die XML-Datei unserialisiere, erstelle ich eine neue Prüfsumme und vergleiche sie mit der ersten?
Appa yip yip
4
Wenn Sie die Prüfsumme in der Anwendung speichern, werden Sie niemals eine andere Konfiguration zulassen. Daher können Sie die Konfigurationsdaten auch als Anwendungskonstanten in Ihrem Code speichern. Wenn Sie die Konfiguration in Zukunft ändern möchten, fügen Sie die Prüfsumme (ein besserer Begriff wäre ein "Hash") als Feld der XML hinzu und überprüfen Sie, ob die XML nicht manipuliert wurde. Natürlich könnte ein entschlossener Angreifer Ihren Code untersuchen, Ihre Hash-Logik finden und daraus gültige XML-Dateien erstellen, aber clientseitige Anwendungen sind immer anfällig für entschlossene Angreifer.
SJuan76
4
Anstelle einer Datei oder einer lokalen Datenbank wäre eine in die Assembly eingebettete Ressourcendatei besser. Ausgeblendet für Endbenutzer, vom Entwickler einfach zu verwalten und dennoch benutzerfreundlich. Wenn die Leistung ein Problem darstellt, ist die binäre Serialisierung überlegen.
PTwr
@ SJuan76 Ja, das Problem von Hash auf XML ist, dass es geändert werden kann, wenn jemand es unserialisiert. Wie auch immer, wenn sich die XML-Änderung (von der ich denke, dass sie nicht passieren wird, aber wer weiß) nur bei einer neuen Version der App ändert, werde ich mich wohl an den Hash-Code halten.
Appa yip yip
2
@schmaedeck: Ressourcendateien sind buchstäblich Dateien innerhalb der ausführbaren Binärdatei. Symbole und Zeichenfolgen sowie alle anderen konstanten Daten, die Ihr Programm benötigt.
Mooing Duck
21

Wenn sich die Daten nie ändern und schreibgeschützt sind , fügen Sie sie einfach als Liste von Konstanten in eine Codedatei ein.

public readonly string AppStartUpData = "MyAppNeedsThis";

Wenn diese Daten je nach Bereitstellung unterschiedlich sind, ist eine externe Datei in Ordnung.

.Net wird mit eingebauten .config-Dateien geliefert (App.Config). Man sollte diese verwenden, da es Standardmethoden gibt (die in das Framework integriert sind), um die Informationen daraus zu lesen.

Verwenden Sie die Konfigurationsdateien für den Fall, dass eine Einstellung geändert werden muss (sagen Sie niemals nie), da es sich nur um Textdateien (XML) handelt. Wenn vertrauliche Informationen vorhanden sind, kann bei Bedarf eine Einstellung verschlüsselt werden.

Jon Raynor
quelle
Ich habe über die Konstanten / readonlys nachgedacht, das Problem ist, dass es viele Daten gibt, also schätze ich, dass ich die externe Datei nachverfolgen werde. Vielen Dank!
Appa yip yip
5
@schmaedeck ... also? Sie können diese Definitionen in einer separaten Datei ablegen und diese importieren. Tatsächlich glaube ich, dass Qt beim Kompilieren von Formularen und anderen Dingen so vorgeht, dass Sie am Ende automatisch generierte Dateien haben, die Megabyte an Binärdaten (z. B. Bilder) in einigen Konstanten enthalten. Wenn es sich jedoch um eine separate Datei handelt, ist daran nichts auszusetzen .
Bakuriu
15

Sie können Ihrem Projekt jederzeit eine Datei hinzufügen und ihren Build-Typ Embedded Resourceso festlegen, dass sie direkt in die Anwendung selbst eingebettet wird.

Alternativ eine Datei, die verschlüsselt und an einem zugänglichen Ort abgelegt wird.

TheLethalCoder
quelle
1
Das ist die beste Antwort. Ich würde gerne mehr Anleitungen sehen, wie dies erreicht werden kann. Sie können die Vorteile einer möglicherweise veränderbaren Konfigurationsdatei nutzen, diese jedoch statisch halten, da sie in Ihre Assembly eingebettet ist.
Gusdor
5

Wenn der Benutzer nicht einmal einen Blick auf die Daten werfen soll, sollten Sie sie in eine binäre Datendatei serialisieren.

Nur die App würde die Länge der zu lesenden Chunks kennen.

Ich kenne C # nicht, aber in Java würden Sie die Datei folgendermaßen erstellen:

FileOutputStream fos = new FileOutputStream(file);      
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(var1);
oos.writeObject(var2);
oos.writeObject(var3);
oos.writeObject(var4);

... und sie lesen es so:

FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Object o[] = new Object[4];
o[0] = ois.readObject();
o[1] = ois.readObject();
o[2] = ois.readObject();
o[3] = ois.readObject();
Tulains Córdova
quelle
Ich werde sicherlich die binäre Serialisierung verwenden. Vielen Dank für deine Zeit!
Appa yip yip