Ich möchte die Objekte speichern, die ich in einem Programm erstellt habe. Nach dem Neustart sollte die App automatisch alle Objekte in einem Array laden. Ich möchte sie in eine Datei schreiben und sie nach dem Neustart analysieren. Sind die anderen schlaueren Möglichkeiten als es von Hand? Danke
Sie können die Klasse Berkeley DB PersistentMap
verwenden, um Ihre ( Serializable
) Objekte in einer Map
-Implementierung (einem Cache) zu speichern, die sie in einer Datei speichert. Es ist ziemlich einfach zu bedienen und bedeutet, dass Sie sich keine Gedanken darüber machen müssen, wo Sie speichern sollen.
Drei Dinge zur Serialisierung:
Ja, das Konzept, nach dem Sie suchen, heißt Serialisierung. Es gibt ein gutes Tutorial bei Sun hier .
Die Idee ist, dass Klassen, die Sie beibehalten möchten, die Serializable-Schnittstelle implementieren müssen. Anschließend verwenden Sie java.io.ObjectOutputStream.writeObject (), um das Objekt in eine Datei zu schreiben, und java.io.ObjectInputStream.readObject (), um es zurückzulesen.
Sie können nicht alles serialisieren, da es Dinge gibt, die für die Serialisierung nicht sinnvoll sind, aber Sie können sie umgehen. Hier ist ein Zitat dazu:
Der grundlegende Mechanismus von Java Serialisierung ist einfach zu bedienen, aber Es gibt noch mehr zu wissen. Wie zuvor erwähnt, nur Objekte markiert Serializable kann beibehalten werden. Das java.lang.Object Klasse nicht implementieren diese Schnittstelle. Deshalb, nicht alle Objekte in Java können sein persistent automatisch. Die guten Nachrichten sind die meisten von ihnen - wie AWT und Swing GUI-Komponenten, Zeichenfolgen und Arrays - sind serialisierbar.
Auf der anderen Seite, gewiss Klassen auf Systemebene wie Thread, OutputStream und seine Unterklassen und Sockel sind nicht serialisierbar. Tatsächlich, es würde keinen Sinn ergeben, wenn sie wurden. Zum Beispiel Thread läuft in Meine JVM würde mein System benutzen Erinnerung. Bleibe dabei und versuche es Führen Sie es in Ihrer JVM würde keinen Sinn machen überhaupt. Ein weiterer wichtiger Punkt über java.lang.Object implementiert nicht die Serialisierbare Schnittstelle ist das beliebige Klasse, die Sie erstellen, die nur erweitert wird Objekt (und kein anderes serialisierbar Klassen) ist nicht serialisierbar, es sei denn Sie implementieren die Schnittstelle selbst (wie im vorherigen Beispiel).
Diese Situation wirft ein Problem auf: Was ist, wenn wir eine Klasse haben, die enthält? eine Instanz von Thread? In diesem Fall, Können wir jemals Objekte davon bestehen lassen? Art? Die Antwort ist ja, solange wir Sag dem Serialisierungsmechanismus unsere Absichten durch Markierung unserer Klasse Thread-Objekt als Transient.
Sie können Effektives Java für einige Fehler in Bezug auf die Serialisierung auschecken. Diese sind im Allgemeinen fortgeschritten, aber wenn diese Funktion ein zentraler Teil Ihrer App ist, sollten Sie sie im Voraus kennen.
Beispiele umfassen Sicherheitsbedenken, Vererbung und vor allem das Potenzial, eine API öffentlich einzufrieren, wenn sie realisiert wird (z. B. über Versionen von Software). Auch dies sind alle fortgeschritten und sollten Sie nicht per se abschrecken.
java.io.Object [Input / Output] Stream sind die zwei Klassen, die Sie betrachten müssen.
Jede Klasse, die in einer Datei beibehalten werden soll, muss die java.io.Serializable-Schnittstelle implementieren.
Vielleicht möchten Sie auch die XML-Codierung in Betracht ziehen, die meiner Meinung nach mehr Haltbarkeit hat als die Serialisierung. Verwenden Sie java.beans.XMLEncoder/XMLDecoder
classes.
Ich stimme mit mjlee überein, dass Protokollpuffer von Google eine bessere Möglichkeit für die Ausführung von Geschäftsobjekten darstellt als der ursprüngliche Serialisierungsweg. Schau es dir an und du wirst es lieben.
Ich frage mich, warum niemand JSON erwähnt und zum Beispiel Jackson JSON-Serializer .