Sehr sonderbares Verhalten

javamax2000

Neues Mitglied
Servus,

aktuell bin ich dabei eine Bibliohek für das Einspeichern, Auslesen (löschen etc. soweit bin ich noch nicht) von Werkzeugen anzulegen. Der Speichermechanismus funktioniert über eine Serialisierung.
Problem: Das Serialisieren/ Deserialisieren verhält sich sehr komisch:

Ich füge neu anzulegende Objekte mit der Syntax

try (FileOutputStream fos = new FileOutputStream ("tools_cyl.ser", true);
ObjectOutputStream oos = new ObjectOutputStream (fos)) {
oos.writeObject(tools_cyl);
}

ans Ende der aktuellen Serialisierungsdatei hinzu (.ser Datei wird also nicht überschrieben, sollte eigentlich so passen).

Wenn ich nun in einem Programmdurchlauf A ein Werkzeug einspeichere und im nächsten Durchlauf B ein anderes Werkzeug und dann im Durchlauf C nach diesen Werkzeugen suche, finde ich sie auch. Das funktioniert bis zu diesem Punkt alles einwandfrei. Ab dem Punkt, dass ich aber ein drittes Werkzeug in einem separaten Programmdurchlauf hinzufüge, kann man dieses nicht mehr finden.
Es gibt auch die Möglichkeit mehrere Werkzeuge in einem Programmdurchlauf zu speichern, dann kann ich diese auch suchen und finden, unabhängig wie viele Werkzeuge ich speichere.

Ich sitze jetzt ewig dran und versuche eine Lösung zu finden, bin aber völlig ratlos.
Ich verstehe überhaupt nicht, wo das Problem liegt, denn das Beispiel mit Durchlauf A, B, C zeigt ja, dass es (wenn auch nur für die ersten 2 Werkzeuge) prinzipiell möglich ist, Objekte in separaten Durchläufen zu speichern und auch wieder zu finden.

Die Eclipse Archiv Datei findet ihr hier:


(Hauptklasse ist Tool_Lib,
Am Anfang Deklaration der globalen Variablen, inkl. einer ArrayList in die die neuen Werkzeuge eingespeichert werden,
danach Abfrage, was der Benutzer machen will (Werkzeug speichern, finden, löschen etc.)
setTool_Cyl ist eine Funktion zur Erzeugung eines Werkzeugs- das Objekt wird dann in oben genannte ArrayList hinzugefügt
getTool_Cyl ist die Funktion zur Suche nach einem Werkzeug- hier wird eine geklonte ArrayList aus der .ser Datei erzeugt und dann nach Übereinstimmung gesucht

Die main ist das Hauptprogramm, falls ein neues Werkzeug/ neue Werkzeuge gespeichert wird/ werden, wird hier auch die so entstandene ArrayList an die .ser Datei angehängt)

Ich hoffe auf eure Hilfe!!

Grüße,
Max
 
Ich denke du solltest dein Programm noch mal überdenken. Deine Kommentare deuten an, dass du das Programm länger verwenden willst. Dafür ist Serialisierung eigentlich ungeeignet. Das Erweitern einer Datei bei Serialisierung habe ich noch nie gesehen. Es wäre möglich das so etwas gar nicht funktioniert. Verwende besser ein Format wie JSON ober falls du oft ändern willst eine Embedded-DB wie H2.
Es ist nicht nötig gefühlte 20 Scanner zu benutzen, einer reicht völlig.
 
Also ich kann aus Deiner Fehlerbeschreibung nicht wirklich viel ablesen.

Was ich für möglich halte:
a) serialVersionUID fehlt in den Klassen Tool_cyl_mono und Tool_cyl_wsp. Damit kann es sein, dass Du Instanzen der Klasse nach einem neu übersetzen nicht einlesen kannst.
b) Das Anhängen erachte ich für problematisch. Der neu erzeugte ObjectOutputStream schreibt ein paar Bytes Initialisierung. Dies dürfte dann ggf. bei der Deserialisierung stören.
 
Generell würde ich von einer Binary Serialisierung absehen, wenn Du dafür nicht sehr gute Gründe hast. Es scheint nur auf den ersten Blick einfach sein, aber die Komplexität kann sehr schnell steigen. Daher würde ich immer auf andere Formate ausweichen:
- Für den Transport von A nach B sind JSON und XML die bevorzugte Wahl.
- Für eine Datenspeicherung sind Datenbanken oft die bessere Wahl.
 
Schonmal vielen Dank für alle Antworten!

Ich werde mal versuchen alle von euch genannten Tipps umzusetzen und beobachten was dann passiert. Mit der Serialisierung gebe ich euch völlig Recht- der Grund warum ich dennoch serialisiert habe ist, dass ich nicht aus dem Bereich Informatik komme und mir die Grundlagen daher selbst aneignen muss. Serialisierung war in diesem Zusammenhang für mich der verständlichste Speichermechanismus. Falls hier jemand ein paar Worte zum Thema JSON verlieren möchte oder einen Link hat zu einer (verständlichen) Doku/ Übersicht zu diesem Thema, freue ich mich natürlich.

Grüße,
Max
 
Also wen Du etwas als XML oder JSON speichern willst, dann nimmst Du dazu am Besten einfach eine Library wie z.B. gson oder Jackson.

Der Vorteil ist, dass Du da dann so gut wie keinen Code schreiben musst. Du hast dann einfach eine Klasse, die z.B. Deine Werte alle in einer Liste hält und speicherst diese dann einfach.

Wenn man in Google sucht nach "gson introduction java", dann finden sich auch sehr viele Einführungen zu gson. (Das gleiche gilt für Jackson wenn man das lieber verwenden möchte).

Aber bei gson läuft es oft auf etwas einfaches wie:
Java:
Gson gson = new Gson();
MyClass instance = gson.fromJson(jsonString, MyClass.class);
und
Code:
Gson gson = new Gson();
String jsonString = gson.toJson(instance);

Natürlich muss man Dinge nicht erst in einen String einlesen - es gibt auch Methoden, um z.B. mit Readern oder Writern direkt zu arbeiten.
 

Zurück
Oben