Java Arraliste speichern

Guten Tag allerseits

Ich muss eine Arrayliste dauerhaft speichern. Ich dachte da an Properties, jedoch merkte ich relativ schnell das diese keine Objekte speichern können.

Wäre es sinnvoller dazu ein XML Parser zu nehmen? So kann ich die ganze Liste direkt im XML speichern und wieder laden.

Gruss und dank schonmal

Java - How Can I Write My ArrayList to a file, and Read (load) that file to the original ArrayList? - Stack Overflow

das Posting mit ‘serialization’ weiter unten dabei beachten

Ab und zu geht es extrem schnell…

Vielen Dank für die Hilfe. bin es im Moment gerade am Umsetzen.

*** Edit ***

Wie handhabt ihr das beim ersten mal?

Wenn noch keine Liste gespeichert wurde habe ich ja auch kein Objekt das zurück kommt und es wird eine Exception geworfen.

File.exists

Hehe, dieser Teil ist klar :slight_smile:

Nur es gibt auch die Situation das das File da ist aber ohne Inhalt… Aber habe es über die Exception bereits abgefangen und entsprechen reagiert.

*** Edit ***

Ich lerne gerade für mein Leben :slight_smile:

In dieser Arrayliste habe ich eine ObservableArrayList drin, diese ist nicht serialisierbar :slight_smile:

Nun bleibt mir nur noch die Variante über XML oder?

was würdest du denn im XML dazu konkret speichern?
all das kannst du auch in irgendwas serialisierbaren, z.B. einen String, schreiben und serialisieren,
freilich ginge dann auch eine Textdatei, und gegen XML habe ich schon gar nix, immer gut

evtl. auch eine Kombination, paar Objekte normal halten und andere Informationen umwandeln um sie dann zu serialisieren,

evtl. die Objekte aus der ObservableArrayList herausholen, für sich speichern,
beim Laden der Liste eine neue ObservableArrayList zusammenbauen
-> geht natürlich nicht für sich falls Listener als Bestandteile anderer größerer Objekte der Anwendung beteiligt sind usw.

kann kompliziert werden, aber so auch XML & Co.,
genau überlegen, was zu speichern, was später benötigt, wie der Neuaufbau,
reine Notizen/ Hinweise als Text durchaus möglich

Serialisierung hilft bei dauerhaften konkreten Objekten einfacher als auch komplexer Klassen ;),
Listener, GUI-Elemente, Threads, API-Klassen wie DB-Connection usw. zählen nicht (gut) dazu, fehlt die Einfachheit

Das wird ein wenig komplizierter als bis jetzt angenommen…

Ich speichere meine Artikellisten aktuell mit einem XML Parser:

	 * Speichert die konplette Artikelliste
	 * 
	 * @param file
	 */
	private void saveArtikelToFile(File file) {
		XStream xstream = new XStream(new DomDriver());
		xstream.alias("artikel", Artikel.class);

		ObservableList<Artikel> artikel = FXCollections.observableArrayList();

		artikel.addAll(verwArtikel.getArtikelListe());

		String xml = xstream.toXML(artikel);

		try {
			FileUtil.saveFile(xml, file);

			setArtikelFilePath(file);

		} catch (Exception e) { // catches ANY exception
			Dialogs.create().owner(stageHauptfenster).title("Error Dialog").masthead("Datei konnte nicht gespeichert werden:")
					.message(file.getPath()).showError();
		}
	}```

Das funktioniert echt gut und ist für mich sehr einfach...

Die jetzige Liste enthält jetzt die Observable list was es unmöglich macht diese vernünftig zu speichern. Das File wird über 100Mb gross da der ganze Overhead der Observable list mitgespeichert wird.

Irgendwie muss da jetzt eine schlauche Methode her...

[quote=SlaterB]evtl. die Objekte aus der ObservableArrayList herausholen, für sich speichern,
beim Laden der Liste eine neue ObservableArrayList zusammenbauen[/quote]
Ergänzend zu SlaterB’s Tipp, die Serialisierung nicht serialiserbarer Objekte selbst zu machen, ein paar Hinweise:

  1. Das „selbst“ machen geht durch Implementierung der Methoden readObject/writeObject
  2. Anschauliche Einführung in das Thema Serializable: Java Practices → Implementing Serializable
  3. Wenn 2. grob verstanden, schaue Dir den Quellcode der Methoden readObject/writeObject in LinkedList an.
    4. Wie auch schon von SlaterB angedeutet, GUI-Objekte sind i.d.R. keine geeigneten Kandidaten für Serialisierung (deswegen implementieren sie eben auch nicht Serializable). Wenn die angezeigten Daten serialisiert werden sollen, schaue ins Model, wenn der Status von GUI-Elementen „serialisiert“ werden soll, mach es mit anderen Mitteln (Properties sind ja bereits genannt).

*** Edit ***

Die „schlaue“ Methode ist, nur die Elemente zu serialisieren und nicht ihren Container (die xyzList). Mir ist bei Lektüre Deines Codes darüber hinaus auch nicht klar, warum Du überhaut eine ObservableList verwendest…

[quote=headnut]Das funktioniert echt gut und ist für mich sehr einfach…

Die jetzige Liste enthält jetzt die Observable list was es unmöglich macht diese vernünftig zu speichern. Das File wird über 100Mb gross da der ganze Overhead der Observable list mitgespeichert wird.[/quote]
was bedeutet der zweite Satz, ist deine jetztige Lösung ein Problem von 100 MB oder nicht?
wenn es schon läuft, dann doch ganz ok

Alternative wäre evtl.

 
        ObservableList<Artikel> artikel = FXCollections.observableArrayList();
 
        List<Artikel> saveList = .. addall
        // Serializierung saveList

und später neue ObservableList wieder aufbauen, das musst du im XML-Fall genauso,
Serialisierung der normalen Liste (wenn möglich mit Artikel) würde individuellen XML-Code zum Schreiben und Parsen dazu einsparen,

aber gibt natürlich auch dafür Standard-Mechanismen, wenn XStream eine API-Klasse ist, dann in der Hinsicht schon gleichwertig,
höchstens noch Detailfragen wie Größe der Datei, Kompablität mit verschiedenen Versionen der Klasse (selten wichtig, und Serialisierung nicht besonders gut),
schon wichtiger die Frage ob untereinander verknüpfte Objekte, doppelt abgelegte Objekte die == sind usw. am Ende genauso wieder herauskommen


ähh, was genau ich angedeutet habe mal beiseite, aber

                                               TransferHandler.HasGetTransferHandler {

und eigentlich doppelt, auch schon tiefer

public abstract class Component implements ImageObserver, MenuContainer,
                                           Serializable {

:wink:
GC: JComponent - javax.swing.JComponent (.java) - GrepCode Class Source

aber empfehlenswert finde ich das nicht

edit:
[JavaSpecialists 013a] - Serializing GUI Components Across Network

My thoughts were: No one in their right mind would want to serialize GUI components, so why are they serializable in the first place? Luckily for me, some of my friends are not in their right mind :slight_smile: Many thanks to

Weil ich in der GUI eine Tabelle habe und diese via binding auf die ObservableList schaut. JavaFX…

[quote=SlaterB;116001]was bedeutet der zweite Satz, ist deine jetztige Lösung ein Problem von 100 MB oder nicht?
wenn es schon läuft, dann doch ganz ok[/quote]

Ja eigentlich würde es so laufen, wenn ich später jedoch 10 Einträge habe bin ich bereits bei einer GB Datei…

Es bleibt mir nichts anderes übrig als die ObservableList in eine Arrayliste zu packen und diese separat zu speichern.

was sind denn die 100 MB, im Falle von XML kann man ja die Datei näher anschauen, welche Daten werden alle gespeichert,
bekannt ob unnötige Anhängsel, bekannt ob Doppeltes hineinkommt,
oder alles wichtig nur schlicht großer Platzbedarf?


wie gesagt ist allgemein das Verhalten von Verknüfungen und Doppelten wichtig,
wenn ein Objekt A 5x in der Liste steht (5x von der Liste bzw. dessen Teilobjekten referenziert wird), dann nur 1x in seinen Daten abspeichern, Rest kleine Verweise

allgemeiner: wenn A auf C verweist und B auf C, dann muss man C nur einmal abspeichern, nicht 2x,

wenn ein Objekt A ein anderes Objekt B referenziert wird B mitgespeichert,
referenziert B wieder auf A dann darf nicht nochmal A gespeichert werden und wieder B und …, das ist natürlich sofort Endlosschleife und kaputt, wird nicht bei 100 MB aufhören

wenn A auf quasi das gesamte Restprogramm verweist und B auch, dann schon gar nicht alles 2x speichern (wahrscheinlich A und B auch wieder mit dabei),
aber wahrscheinlich auch nichtmal 1x zu speichern, gar nicht benötigt
-> es gibt für Variablen eines der seltenen Schlüsselwörter wie private & Co, nämlich transient, exklusiv oder jedenfalls wichtig für Serialisierung,
was darin steht wird nicht mitserialisiert

Ich muss selbst was schreiben so viel steht fest…

Die Datei lässt sich zwar speichern aber nicht mehr laden…

Das heisst ich kann es auch gleich auf eine Vernünftige art schreiben… Was auch immer Vernünftig ist

*** Edit ***

Ich habe mir nun kurz ein kleines beispiel geschrieben. Dort hat es funktioniert.

Es sieht so aus, als ober er sämtliche Bindings die an die liste oder die Propertys angebunden sind mit speichert.

Weis jemand wie man das umgeht? Ohne die Bindings zu löschen :slight_smile:

*** Edit ***

Ich habe ein beispiel gefunden:

JavaFX 8 Tutorial - Part 5: Storing Data as XML | code.makery.ch

Kann man das nicht einfach mit BufferedWriter machen, indem man eine txt-Datei erstellt?

BufferedWriter können nur String speichern. Ich möchte jedoch eine liste abspeichern mit SimpleStringPropertys und ObservableList Einträgen