Ich möchte die Objekte, die ich in einem Programm erzeugt habe, speichern. Nach dem Neustart soll die App automatisch alle Objekte in ein Array laden. Ich möchte sie in eine Datei schreiben und nach dem Neustart parsen. Gibt es noch andere Möglichkeiten als das von Hand zu machen? Vielen Dank!
Antworten
Zu viele Anzeigen?Ja, das Konzept, nach dem Sie suchen, heißt Serialisierung. Es gibt ein gutes Tutorial bei Sun ici .
Die Idee ist, dass Klassen, die persistieren sollen, die Schnittstelle Serializable implementieren müssen. Danach verwenden Sie java.io.ObjectOutputStream.writeObject(), um das Objekt in eine Datei zu schreiben und java.io.ObjectInputStream.readObject(), um es zurückzulesen.
Man kann nicht alles serialisieren, denn es gibt Dinge, die nicht sinnvoll sind, aber man kann sie umgehen. Hier ist ein Zitat dazu:
Der grundlegende Mechanismus von Java Serialisierung ist einfach zu bedienen, aber es gibt noch einige weitere Dinge zu wissen. Wie bereits erwähnt, sind nur Objekte, die als Serializable markiert sind, persistiert werden. Die java.lang.Object Klasse implementiert nicht implementiert diese Schnittstelle nicht. Deshalb können nicht alle Objekte in Java automatisch persistiert werden. Die gute Nachricht ist, dass die meisten von ihnen - wie AWT und Swing GUI-Komponenten, Strings und Arrays - serialisierbar sind.
Auf der anderen Seite, bestimmte System-Level-Klassen wie z.B. Thread, OutputStream und seine Unterklassen, und Socket sind nicht serialisierbar. Das stimmt, würde es keinen Sinn machen, wenn sie wären. Zum Beispiel würde ein Thread, der in meiner JVM läuft, würde den Speicher meines Systems Speicher. Ihn zu persistieren und zu versuchen ihn in Ihrer JVM laufen zu lassen, würde keinen Sinn überhaupt keinen Sinn. Ein weiterer wichtiger Punkt ist, dass java.lang.Object, das die Schnittstelle Serializable-Schnittstelle nicht implementiert, ist, dass jede Klasse, die Sie erstellen und die nur die Schnittstelle Object (und keine anderen serialisierbaren Klassen) nicht serialisierbar ist, es sei denn Sie implementieren die Schnittstelle selbst (wie im vorigen Beispiel geschehen).
Diese Situation stellt ein Problem dar: Was ist, wenn wir eine Klasse haben, die eine Instanz von Thread enthält? In diesem Fall, können wir Objekte dieses Typs jemals persistieren Typs persistieren? Die Antwort ist ja, solange wir dem Serialisierungsmechanismus unsere Absichten mitteilen, indem wir das Thread-Objekt unserer Klasse Thread-Objekt unserer Klasse als transient markieren.
Sie können die Berkeley DB PersistentMap
Klasse zum Speichern Ihrer ( Serializable
) Objekte in einer Map
Implementierung (einem Cache), der sie in einer Datei speichert. Es ist ziemlich einfach zu bedienen und bedeutet, dass Sie sich keine Gedanken darüber machen müssen, was Sie wo speichern.
Drei Dinge sind bei der Serialisierung zu beachten:
- Wie werden Sie mit Schemaänderungen umgehen (d. h. Änderung der Daten, aus denen Ihre Klassen bestehen - z. B. Hinzufügen eines neuen Feldes)?
- Was passiert, wenn Ihre Datei(en) beschädigt werden? Je nachdem, wie zuverlässig die Speicherung Ihres Programms sein soll, müssen Sie entscheiden, wie Sie die Daten, die Ihre Objekte implizit enthalten, speichern. Denken Sie daran, dass Sie immer eine relationale Datenbank verwenden können, wie z.B. MySQL und wandeln Sie diese Daten dann in Ihre Objekte um
- Müssen Sie die Daten anzeigen oder abfragen können? außerhalb deines Programms? Was, wenn Sie eine einfache Frage wie "Wie viele Objekte haben die Eigenschaft X?" beantworten wollen? Das ist einfach, wenn Sie eine (relationale) Datenbank verwendet haben; nicht so einfach, wenn Sie die Daten in Dateien serialisiert haben!
Sie sollten sich Effective Java ansehen, um einige Probleme bei der Serialisierung zu erfahren. Diese sind in der Regel fortgeschritten, aber wenn diese Funktion ein zentraler Bestandteil Ihrer Anwendung ist, sollten Sie sich im Voraus über sie informieren.
Beispiele hierfür sind Sicherheitsbedenken, Vererbung und vor allem die Möglichkeit, eine API öffentlich "einzufrieren", indem man sie realisiert (z. B. über verschiedene Softwareversionen hinweg). Auch dies sind alles fortgeschrittene Probleme, die Sie nicht per se abschrecken sollten.
- See previous answers
- Weitere Antworten anzeigen