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

War es hilfreich?

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:

  1. 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)
  2. 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
  3. 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top