Java: Speichern Sie Objekte in einer Textdatei? Gibt es fertige Lösungen?
Frage
Ich möchte die Objekte speichern ich in einem Programm generiert. Nach dem Neustart sollte die App geladen werden automatisch alle Objekte in einem Array. Ich möchte, dass sie in eine Datei schreiben und sie nach dem Neustart zu analysieren. Sind die anderen intelligentere Möglichkeiten, als das von Hand? Danke
Lösung
Sie können die Berkeley DB PersistentMap
Klasse Ihre (Serializable
) Objekte in einer Map
Implementierung (ein Cache) speichern, die sie in eine Datei weiterhin besteht. Es ist ziemlich einfach zu bedienen und bedeutet, dass Sie müssen nicht darum kümmern, was zu retten, wo.
Drei Dinge, über die Serialisierung zu beachten:
- Wie werden Sie mit Schemaänderungen fertig zu werden (das heißt zu ändern, welche Daten Ihre Klassen bestehen aus - ein neues Feld zum Beispiel das Hinzufügen)
- Was passiert, wenn Sie Ihre Datei (en) werden beschädigt? Je nachdem, wie die zuverlässige Speicherung Ihres Programms muss seinen Einfluss auf Ihre Entscheidung, wie Sie die Daten speichern, die Ihre Objekte implizit enthalten. Denken Sie daran, immer eine relationale Datenbank wie MySQL verwenden können, und dann wandelt diese Daten in Ihre Objekte
- Müssen Sie in der Lage sein, die Daten zu lesen oder abfragen außerhalb Ihres Programms? Was passiert, wenn Sie einige einfache Frage zu beantworten wie „Wie viel Objekt Eigenschaft X?“ Einfach zu tun, wenn Sie eine (relational) Datenbank verwendet haben; nicht so einfach, wenn Sie serialisierte Zeug Dateien haben!
Andere Tipps
Ja, das Konzept der Sie suchen Serialisierung genannt wird. Es gibt eine feine Tutorial bei Sun hier .
Die Idee ist, dass Klassen, die Sie möchten, müssen bestehen bleiben die Serializable-Schnittstelle implementieren. Danach verwenden Sie java.io.ObjectOutputStream.writeObject (), um das Objekt in eine Datei und java.io.ObjectInputStream.readObject () zu schreiben, es wieder zu lesen.
Sie können nicht alles serialisiert werden, da es Dinge gibt, die Serialisierung keinen Sinn machen, aber man kann um sie herum arbeiten. Hier ist ein Zitat über das:
Der grundlegende Mechanismus von Java Serialisierung ist einfach zu bedienen, aber gibt es einige weitere Dinge zu wissen. Wie bereits erwähnt, nur Objekte markiert Serializable kann beibehalten werden. Das java.lang.Object Klasse nicht diese Schnittstelle implementieren. Deshalb, nicht alle Objekte in Java kann sein automatisch anhielt. Die guten Nachrichten ist, dass die meisten von ihnen - wie AWT und Swing-GUI-Komponenten, Strings und Arrays - sind serializable
.Auf der anderen Seite, bestimmen System-Level-Klassen wie Fäden, Outputstream und ihre Unterklassen, und Sockel sind nicht serialisierbar. Tatsächlich, es würde keinen Sinn machen, wenn sie wurden. Zum Beispiel läuft in Gewinde meine JVM würde mein System verwenden Erinnerung. Persistierende es und versuchen, führen Sie es in Ihrer JVM würde keinen Sinn machen, überhaupt. Ein weiterer wichtiger Punkt, um java.lang.Object Umsetzung nicht die Serializable Schnittstelle ist, dass eine beliebige Klasse erstellen Sie, dass sich nur Object (und kein anderer serializable Klassen) nicht serializable es sei denn, Sie implementieren die Schnittstelle selbst (Wie bei dem vorherigen Beispiel durchgeführt).
Diese Situation stellt ein Problem dar: was passiert, wenn wir eine Klasse, die enthält eine Instanz des Thread? In diesem Fall, können wir immer Objekte davon bestehen bleiben Art? Die Antwort ist ja, solange wir erzählen die Serialisierungsmechanismus unserer Absichten unserer Klasse Kennzeichnung Thread-Objekt als vorübergehend.
Sie möchten für einige gotchas in Bezug auf die Serialisierung überprüfen Effective Java. Diese werden im Allgemeinen vorgeschoben, aber wenn dieses Merkmal ein Kernstück der App ist, werden Sie wollen über sie im Voraus wissen.
Beispiele hierfür sind Sicherheitsbedenken, Vererbung, und vor allem das Potenzial, öffentlich ‚einzufrieren‘ eine API mit ihm realisieren (zum Beispiel über Software-Versionen). Auch dies sind alle fortschrittlichen und sollten Sie nicht per se verhindern.
java.io.Object [Input / Output]-Stream sind die beiden Klassen, die Sie betrachten müssen.
Jede Klasse Sie möchten bestehen Bedürfnisse Datei die java.io.Serializable Schnittstelle implementieren.
Sie können auch mehr Haltbarkeit zu haben, als die Serialisierung unter Verwendung von XML-Codierung, zu prüfen, was ich scheint. Verwenden Sie java.beans.XMLEncoder/XMLDecoder
Klassen.
Ich habe es nicht benutzt, aber Google Code veröffentlicht protobuf vor kurzem.
Ich schließe mjlee dass Protocol Buffers von Google ist ein besserer Weg Speicher zu tun Objekte als die ursprüngliche Serialisierung Art und Weise. Werfen Sie einen Blick und Sie werden es lieben.
Ich frage mich, warum niemand erwähnt JSON und, zum Beispiel, Jackson JSON Serializer