Java: Objekte in einer Textdatei speichern? Gibt es fertige Lösungen?

7

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

    
wellenreiter 04.10.2008, 15:56
quelle

8 Antworten

4

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:

  1. Wie gehen Sie mit Schemaänderungen um (d. h. ändern, aus welchen Daten Ihre Klassen bestehen - fügen Sie z. B. ein neues Feld hinzu)
  2. Was passiert, wenn Ihre Datei (en) beschädigt werden? Abhängig davon, wie zuverlässig der Speicher Ihres Programms sein muss, beeinflusst dies Ihre Entscheidung, wie Sie die Daten speichern, die Ihre Objekte implizit enthalten. Denken Sie daran, dass Sie immer eine relationale Datenbank wie MySQL verwenden und diese Daten dann in Ihre Objekte
  3. konvertieren können
  4. Müssen Sie die Daten außerhalb Ihres Programms anzeigen oder abfragen können? Was ist, wenn Sie eine einfache Frage wie "Wie viele Objekte besitzen Eigenschaft X?" Beantworten möchten? Einfach zu tun, wenn Sie eine (relationale) Datenbank verwendet haben; nicht so einfach, wenn Sie Dateien in Dateien serialisiert haben!
oxbow_lakes 04.10.2008, 17:13
quelle
13

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.

    
Vinko Vrsalovic 04.10.2008 15:58
quelle
2

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.

    
Michael Easter 04.10.2008 17:13
quelle
0

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.

    
Richard Walton 04.10.2008 18:14
quelle
0

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.

    
Kevin Wong 06.10.2008 03:29
quelle
0

Ich habe es nicht verwendet, aber Google Code wurde kürzlich protobuf veröffentlicht.

    
mjlee 06.10.2008 15:16
quelle
0

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.

    
user34984 24.06.2009 20:57
quelle
0

Ich frage mich, warum niemand JSON erwähnt und zum Beispiel Jackson JSON-Serializer .

    
Victor Sergienko 13.12.2012 23:54
quelle

Tags und Links