Beste Möglichkeit, Daten lokal in .NET zu speichern (C #)
Ich Schreibe eine Anwendung, die Benutzer nimmt die Daten und speichert Sie lokal für den späteren Gebrauch. Die Anwendung wird gestartet und gestoppt werden ziemlich oft, und ich möchte es speichern/laden die Daten auf Anwendung starten/beenden.
Es wäre ziemlich einfach, wenn ich verwendet, Flachbild-Dateien, da die Daten nicht wirklich brauchen, zu sichern (es werden nur gespeichert auf diesem PC). Die Optionen, die ich glaube, sind also:
- Flachbild-Dateien
- XML
- SQL-DB
Flachbild-Dateien benötigen ein wenig mehr Aufwand zu pflegen (keine built-in-Klassen wie bei XML), allerdings habe ich keine XML-vor-und SQL-scheint wie overkill für diese relativ leichte Aufgabe.
Gibt es irgendwelche anderen Möglichkeiten, die eine Untersuchung Wert? Wenn nicht, welche von diesen die beste Lösung?
Edit: Um ein wenig mehr Daten zu dem problem, im Grunde die einzige Sache, die ich gern in den laden ist ein Wörterbuch, das wie folgt aussieht
Dictionary<string, List<Account>>
wo Konto ist ein anderer benutzerdefinierter Typ.
Würde ich serialisieren, die das dict als xmlroot, und der Account dann geben Sie als Attribute?
Update 2:
So ist es möglich, zu serialisieren ein Wörterbuch. Was macht es kompliziert ist, dass der Wert für das dict ist eine Allgemeine selbst, das ist eine Liste von komplexen Datenstrukturen vom Typ Konto. Jedes Konto ist ziemlich einfach, es ist nur ein Bündel von Eigenschaften.
Es ist mein Verständnis, dass das Ziel hier ist, zu versuchen und am Ende mit diesem:
<Username1>
<Account1>
<Data1>data1</Data1>
<Data2>data2</Data2>
</Account1>
</Username1>
<Username2>
<Account1>
<Data1>data1</Data1>
<Data2>data2</Data2>
</Account1>
<Account2>
<Data1>data1</Data1>
<Data2>data2</Data2>
</Account2>
</Username2>
Wie Sie sehen können die heirachy ist
- Username (string dict) >
- Konto (jedes Konto in der Liste) >
- - Konto-Daten (d.h. Eigenschaften der Klasse).
Erhalt dieses layout von einem Dictionary<Username, List<Account>>
ist das knifflige bit, und die Essenz dieser Frage.
Gibt es viele "how to" - Antworten Sie hier auf serialisieren, das ist meine Schuld, da ich nicht deutlicher machen früh, aber jetzt bin ich auf der Suche nach einer endgültigen Lösung.
InformationsquelleAutor der Frage George | 2009-12-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde die Datei speichern als JSON. Da bist du der Speicherung ein Wörterbuch, das ist nur ein name/Wert-paar-Liste, dann ist das ziemlich viel, was json entwickelt wurde.
Es gibt aber ein paar anständige, Kostenlose .NET json-Bibliotheken - hier ist ein aber man kann eine vollständige Liste auf der ersten link.
InformationsquelleAutor der Antwort zebrabox
Es hängt wirklich davon ab, was man speichern. Wenn du redest, strukturierte Daten, die dann entweder XML-oder eine sehr einfache SQL-RDBMS wie SQLite oder SQL Server Compact Edition wird gut für Sie arbeiten. Die SQL-Lösung wird besonders überzeugend, wenn die Daten bewegt sich über eine triviale Größe.
Wenn Sie die Speicherung von großen Stücke von relativ unstrukturierten Daten (binäre Objekte wie Bilder, zum Beispiel), dann haben offensichtlich weder eine Datenbank noch die XML-Lösung geeignet sind, aber angesichts Ihrer Frage, ich vermute, es ist mehr der ehemaligen als letztere.
InformationsquelleAutor der Antwort Adam Robinson
XML ist einfach zu bedienen, über die Serialisierung. Verwenden Isolierte Speicherung.
Siehe auch Wie zu entscheiden, wo zu speichern, die pro-user-state? Registry? AppData? Isolierten Speicher?
InformationsquelleAutor der Antwort Cheeso
Alle der oben genannten sind gute Antworten, und in der Regel das problem lösen.
Wenn Sie benötigen eine einfache, Kostenlose Möglichkeit zu skalieren, um Millionen von Stücken von Daten, versuchen, die ESENT Verwaltete Schnittstelle Projekt auf CodePlex.
Es hat eine PersistentDictionary Objekt, das ist ziemlich einfach zu bedienen. Betrachten Sie es als ein Wörterbuch () - Objekt, aber es wird automatisch geladen und auf der Festplatte gespeichert, ohne zusätzlichen code.
Beispiel:
Beantworten George ' s Frage:
InformationsquelleAutor der Antwort GalacticJello
Empfehle ich XML-reader/writer-Klasse für Dateien, denn es ist leicht serialisiert.
Serialisierung in C#
Der folgende code zeigt, wie Sie dies tun:
Du dann in vielleicht ConfigForm, rufen Sie Ihre Klasse ConfigManager und Serialisieren!
Nachdem es serialisiert wurden, können Sie dann rufen Sie die Parameter aus der config-Datei mit dem cm.WindowTitle, etc.
InformationsquelleAutor der Antwort
Eine vierte option, um diejenigen, die Sie erwähnen, sind binäre Dateien. Obwohl das klingt geheimnisvoll und schwierig, es ist wirklich einfach mit der Serialisierung-API .NET.
Ob Sie Binär-oder XML-Dateien, die Sie verwenden können, die gleiche Serialisierung-API, obwohl Sie würde verwenden verschiedene serialisierungsprogramme.
Binäre Serialisierung einer Klasse, muss es markiert werden, mit dem [Serializable] - Attribut oder ISerializable implementieren.
Sie können tun, etwas ähnliches mit XMLobwohl es die IXmlSerializable-Schnittstelle aufgerufen wird, und die Attribute sind [XmlRoot] und anderen Parametern im System.Xml.Serialization-namespace.
Wenn Sie möchten, eine relationale Datenbank zu benutzen, SQL Server Compact Edition ist kostenlos und sehr leicht und basiert auf einer einzelnen Datei.
InformationsquelleAutor der Antwort Mark Seemann
Gerade fertig, Codierung Datenspeicherung für mein Aktuelles Projekt. Hier meine 5 Cent.
Begann ich mit binärer Serialisierung. Es wurde langsam (über 30 Sekunden für das laden von 100.000 Objekte) und es war die Schaffung eine ziemlich große Datei auf der Festplatte als auch. Allerdings, es hat mich ein paar Zeilen code zu implementieren, und ich habe meine alle storage-Anforderungen abgedeckt.
Um bessere Leistung zu erhalten, zog ich auf eine benutzerdefinierte Serialisierung. Gefunden FastSerialization Rahmen von Tim Haynes auf Code-Projekt. In der Tat ist es ein paar mal schneller (hab 12 sec zum laden, 8 s für speichern, 100K Datensätze) und man braucht weniger Speicherplatz. Das framework basiert auf der Technik dargelegt GalacticJello in einem früheren post.
Dann zog ich zu SQLite und war in der Lage zu bekommen 2 manchmal 3-mal schneller performance – 6 sec für das laden und 4 Sek für das speichern, 100K Datensätze. Es umfasst die Analyse ADO.NET Tabellen zur Anwendung Arten. Es gab mir auch viel kleinere Datei auf der Festplatte. Dieser Artikel erklärt, wie man am besten Leistung aus ADO.NET: http://sqlite.phxsoftware.com/forums/t/134.aspx. Erzeugung von INSERT-Anweisungen ist eine sehr schlechte Idee. Können Sie erraten, wie kam ich zu wissen, dass. 🙂 Ja, die SQLite-Implementierung hat mich einiges an Zeit plus eine sorgfältige Messung der Zeit, die durch so ziemlich jede Zeile code.
InformationsquelleAutor der Antwort ACH
Wenn Sie Ihre Sammlung wird zu groß, ich habe festgestellt, dass die Xml-Serialisierung wird ziemlich langsam. Eine weitere option zum serialisieren dein Wörterbuch wäre "roll your own" mit einem BinaryReader und BinaryWriter.
Hier einige Beispiel-code nur für den Einstieg. Sie können diese generische Erweiterung Methoden, um mit jeder Art von Wörterbuch, und es funktioniert ganz gut, aber zu ausführlich, um hier zu posten.
InformationsquelleAutor der Antwort GalacticJello
Wenn Ihre Daten komplexer, hoch in der Menge, oder Sie müssen die Abfrage lokal dann Objekt-Datenbanken könnte eine gültige option. Ich würde vorschlagen, Blick auf Db4o oder Karvonite.
InformationsquelleAutor der Antwort Goran
Dann würde ich zunächst schauen, ist eine Datenbank. Jedoch die Serialisierung ist eine Möglichkeit. Wenn Sie sich für die binäre Serialisierung, dann würde ich vermeiden
BinaryFormatter
- es hat eine Tendenz, sich zu ärgern zwischen den Versionen, wenn Sie Felder ändern etc. Xml viaXmlSerialzier
wäre in Ordnung, und kann side-by-side-kompatibel (D. H. mit den gleichen Klassen-Definitionen) mit protobuf-net, wenn Sie versuchen wollen, den Vertrag-basierte binäre Serialisierung (geben Sie ein flat file Serialisierungsprogramm ohne jegliche Anstrengung).InformationsquelleAutor der Antwort Marc Gravell
Viele der Antworten in diesem thread versuchen, overengineer die Lösung. Wenn ich richtig bin, Sie wollen einfach nur zum speichern der Benutzer-Einstellungen.
Verwenden .ini-Datei oder in der App.Config-Datei für diese.
Wenn ich bin falsch, und Sie sind die Speicherung von Daten, die mehr als nur Einstellungen, verwenden Sie einen flachen text-Datei im csv-format. Diese sind schnell und einfach, ohne den overhead von XML. Leute wie zu poo poo, da Sie nicht so elegant, nicht skaliert nicht gut und nicht so gut Aussehen wie auf einem Lebenslauf, aber es ist die beste Lösung für Sie, je nachdem, was Sie brauchen.
InformationsquelleAutor der Antwort James
Ich habe schon einige "stand-alone" - apps, die eine lokale datenspeicher. Ich denke, das beste, was zu verwenden wäre SQL Server Compact Edition (früher bekannt als SQLAnywhere).
Er ist leicht und frei. Darüber hinaus können Sie stick zu schreiben, eine data-access-layer ist wiederverwendbar in anderen Projekten plus, wenn Sie die app je nach Maßstab etwas größer wie die ausgewachsenen SQL server, müssen Sie nur ändern Sie die Verbindungszeichenfolge.
InformationsquelleAutor der Antwort HitLikeAHammer
Meine erste Neigung ist, eine access-Datenbank. Die .mdb-Dateien sind lokal gespeichert, und werden entschlüsselt, wenn die als notwendig erachtet werden. Wenn XML-oder JSON-würde auch Arbeit für viele Szenarien. Flache Dateien würde ich nur verwenden, für den nur-lese -, nicht-Suche (vorwärts-nur Lesen) Informationen. Ich Neige zu bevorzugen, die das csv-format zum festlegen der Breite.
InformationsquelleAutor der Antwort Matthew Vines
Kommt es auf die Menge der Daten, die Sie schauen, um zu speichern. In Wirklichkeit gibt es keinen Unterschied zwischen flat-files und XML. XML würde wohl vorzuziehen sein, da es bietet eine Struktur, um das Dokument. In der Praxis
Die Letzte option, und eine Menge von Anwendungen verwenden jetzt die Windows-Registry. Ich persönlich nicht empfehlen (Registry Aufblasen, Korruption, andere potenzielle Probleme), aber es ist eine option.
InformationsquelleAutor der Antwort blacksol
Ohne zu wissen, was Ihre Daten aussieht, also die Komplexität, Größe, etc...XML ist leicht zu pflegen und leicht zugänglich. Ich würde NICHT eine Access-Datenbank verwenden, und flat-Dateien sind schwieriger zu pflegen, über die Langstrecke, vor allem, wenn Sie Umgang mit mehr als einem Daten-Feld/element in Ihre Datei.
Ich den Umgang mit großen flat-file-Daten-feeds in guten Mengen täglich, und auch wenn das ein extremes Beispiel, flat-file-Daten ist viel schwieriger zu verwalten als die XML-Daten-feeds, die ich verarbeiten.
Ein einfaches Beispiel für das laden von XML-Daten in ein dataset mit C#:
Können Sie auch überprüfen, LINQ to XML als option für die Abfrage der XML-Daten...
HTH...
InformationsquelleAutor der Antwort Tom Miller
Wenn Sie gehen, die binäre Serialisierung route, die Geschwindigkeit, an dem ein bestimmtes Mitglied das datum zugegriffen werden muss. Wenn es nur eine kleine Sammlung, laden Sie die gesamte Datei wird Sinn machen, aber wenn Sie groß werden, Sie kann auch sinnvoll sein, eine index-Datei.
Tracking-Konto-Eigenschaften/Feldern, die sich an einer bestimmten Adresse innerhalb der Datei kann Ihnen helfen, beschleunigen den Zugriff, vor allem, wenn Sie optimieren, dass die index-Datei basierend auf key usage. (vielleicht sogar beim schreiben auf der Festplatte.)
InformationsquelleAutor der Antwort Todd Richardson
Je nach compelexity von Ihrem Konto Objekt, ich würde empfehlen, entweder XML-oder Flatfiles.
Wenn es nur ein paar Werte zu speichern, für jedes Konto, könnten Sie speichern Sie Sie auf einer properties-Datei, wie hier:
... und so weiter. Lesen aus einer properties-Datei sollte einfacher sein, als es Karten, die direkt einen string Wörterbuch.
Da an, wo Sie diese Datei speichern, die beste Wahl wäre, um zu speichern in AppData-Ordner, in einem Unterordner für Ihr Programm. Dies ist ein Ort, wo aktuelle Benutzer immer Zugriff zum schreiben, und es ist sicher verwahrt, von anderen Benutzern, indem Sie das OS selbst.
InformationsquelleAutor der Antwort Pablo Venturino
Halten Sie es einfach - wie du schon sagtest, ein Flachbild-Datei ist ausreichend. Verwenden Sie eine flache Datei.
Dies ist unter der Annahme, dass Sie analysiert haben, Ihre Anforderungen richtig. Ich würde überspringen die Serialisierung als XML-Schritt, übertrieben für ein einfaches Wörterbuch. Gleiche Sache für eine Datenbank.
InformationsquelleAutor der Antwort Larry Watanabe
Meiner Erfahrung nach in den meisten Fällen JSON in eine Datei ist genug (meist müssen Sie zum speichern ein array oder ein Objekt oder einfach nur eine einzelne Zahl oder string). Ich habe selten brauchen SQLite (das braucht mehr Zeit, für die es einrichten und verwenden es, die meisten der Zeit, es ist overkill).
InformationsquelleAutor der Antwort JedatKinports