Serialisierung einer verschachtelten Datenstuktur

kalabalik

Mitglied
Liebe Leute,

ich schreibe für die Uni gerade ein Programm, das über eine verschachtelte Datenstruktur verfügt: eine ArrayList<Node> speichert Nodes, die Circles oder Rects sein können und über eine ArrayList<Edge> als Instanzvariable verfügen, die wiederum Edges speichert, die auf andere Nodes verweisen - andere als die Node, deren ArrayList<Edge> den aktuellen Edge enthält. Der Verweis des Edge auf "seine" Node erfolgt dabei per int auf die Position der betreffenden Node in der ArrayList<Node> (es gibt also keinen Zirkelverweis per Referenzvariablen zwischen Node, ArrayList<Edge> und Edge). Die Kinder der Nodes (Circles oder Rects) sowie die diese verbindenden Edges werden als JPanels auf einem großen JPanel dargestellt.

Nun soll das Ganze (zur internen und externen Speicherung) serialisiert (und deserialisiert) werden. Geht das mittels einfacher Serialisierung, der ich meine ArrayList<Node> füttere? Es gibt in der Datenstruktur ja durchgängig Verweise von Objekten der einen Klasse auf Objekte der nächsten Klasse. Allerdings sind diese Verweise nicht unbedingt Instanzvariablen, sondern im Fall der ArrayLists generische Parameter. Gibt es da bekannte Serialisierungsprobleme (und natürlich -lösungen)?

Ich habs bislang (lang) vergeblich versucht und bekomme beim Serialisieren zwar keine Fehlermeldung, aber ein höchst seltsames Verhalten der Nodes. Sie lassen sich nur noch einmal von nicht-markiert nach markiert schalten, nicht mehr bewegen und nicht mehr als Ziel für Edges auswählen. (Löschen lassen sie sich auch nicht mehr, aber das muss man nicht überbewerten, da meine Löschmethode (wegen der ArrayList über einen Iterator) auch im Zustand vor der Serialisierung noch einen Bug hat.)

Soweit ich sehe, ists kein Problem mit einer durch die Serialisierung zurückgesetzten statischen Variable, und ich vermute eher, dass die Serialisierung selbst das Problem ist. Kann mir jemand sagen, wie ich das prüfen kann? (Ich schreibe in ein byte[].)

Bei Bedarf kann ich natürlich Code liefern, aber bevor ich 1000 Zeilen Code aufs Nötigste eindampfe, wollte ich zunächst einmal nur mit einer Problembeschreibung in die Runde fragen.

Merci für die Antworten.
 

Tobse

Top Contributor
Das sollte möglich sein, einfach ausprobieren. Es müssen nur alle verwendeten Klassen java.io.Serializable implementieren.
 

kalabalik

Mitglied
Genau, ich habe serializable überall dort implementiert, wo es nicht schon von ererbt wurde, wie z.B. in den Kinderklassen von JPanel und ListArray. Außerdem habe ich von Eclipse für alle Klassen (abgesehen von der attributlosen Main-Klasse, die nur die main-Methode enthält) eine serialVersionUID generieren lassen. Wie gesagt, es gibt keine Fehlermeldung.

Vielleicht poste ich zunächst einmal meine drei Methoden zur Serialisierung, Deserialisierung und zum Aufruf dieser beiden Methoden. Ist das richtig so?

Merci für die Antworten!

Java:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;

...

final class Controller implements Serializable {
	private static final long serialVersionUID = -689295271208898871L;

...

public static byte[] serializeToByteArray(Object originalObject) {
		try {
			ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
			ObjectOutputStream objectOutputStream = new ObjectOutputStream(
					byteArrayOutputStream);
			objectOutputStream.writeObject(originalObject);
			objectOutputStream.close();
			return byteArrayOutputStream.toByteArray();
		} catch (IOException iOE) {
			iOE.printStackTrace();
		}
		return null;
	}

	public static Object deserializeFromToByteArray(byte[] modelToByteArray) {
		if (modelToByteArray != null) {
			try {
				ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
						modelToByteArray);
				ObjectInputStream objectInputStream = new ObjectInputStream(
						byteArrayInputStream);
				Object copyObject = objectInputStream.readObject();
				objectInputStream.close();
				return copyObject;
			} catch (IOException iOE) {
				iOE.printStackTrace();
			} catch (ClassNotFoundException cNFE) {
				cNFE.printStackTrace();
			}
		}
		return null;
	}

	void storeAndRestoreModel() {
		try {
			byte[] modelToByteArray = serializeToByteArray(model);
			// do something
			model = (Model) deserializeFromToByteArray(modelToByteArray);
			view.revalidate();
			view.repaint();
			if (!model.nodeList.isEmpty()) {
				for (Node node : model.nodeList) {
					node.revalidate();
					node.repaint();
				}
			}
		} catch (ClassCastException cCE) {
			cCE.printStackTrace();
		}
	}
}
 
Zuletzt bearbeitet:
M

Marcinek

Gast
Eine Klasse, die Serializable implementiert ist nicht sofort Serialisierbar.

JPanel ist es nicht. Egal, wie oft du Serializable implementierst.
 

kalabalik

Mitglied
Reicht es eventuell schon, alle JPanels (und andere Swing-Komponenten?) nur in vererbter Form zu verwenden? Bei meinen Nodes und Edges ist das der Fall, aber in der View, die selbst von JPanel erbt, instanziiere ich ein weiteres JPanel direkt (soll heißen ohne Vererbung) ebenso wie eine Reihe anderer Swing-Komponenten (JFrame, JScrollPane, JMenuBar, JMenu, JMenuItem).

Merci again.
 

Tobse

Top Contributor
es gibt keine Fehlermeldung.

Ich geh dann mal davon aus, dass es geklappt hat?

Java:
ArrayList<Node> nodes=new ArrayList<Node>();
ObjectOutputStream s=new ObjectOutputStream(new FileOutputStream(new File("foo.ser")));
s.writeObject(nodes);
s.close();
ObjectInputStream s2=new ObjectInputStream(new FileInputStream(new File("foo.ser")));
nodes=(ArrayList<Node>) s2.readObject();
s2.close();

nodes testen...

Mach doch das mal.
 

kalabalik

Mitglied
@Marcinek

Ja, das klingt logisch und ist kein Problem bezüglich der View. Meine Nodes und Edges aber sind hinsichtlich der Unterscheidung von View und Model nicht Fisch und nicht Fleisch. Als JPanels (im Fall der Nodes ausgestattet mit Action-, Mouse- und MouseMotionListeners ausgestattet) gehören sie der View an, als Datenträger (z.B. der Koordinaten und des boolean marked) würde man sie dem Model zuordnen. Vielleicht wäre eine saubere Trennung der Funktionen, indem ich die paintComponent der beiden Klassen in die View auslagere. Mal sehen, ob das geht.

@Tobse
Nein, bisher hat es nicht geklappt. Es gibt zwar keine Fehlermeldung, aber "wirre" Objekte, die nicht mehr die Funktionalitäten meiner Originalobjekte haben.
Deinen Code habe ich ausprobiert, aber das Resultat ist dasselbe: Nodes, die sich nur noch selektieren, aber weder deselektieren noch verschieben noch durch Edges verbinden lassen. Wäre ja auch verwunderlich, da doch auf dieselben Write- und Read-Methoden zugegriffen wird, oder? Weißt Du, wo die Datei hingeschrieben wurde und wie ich sie mir ansehen kann?
 

Tobse

Top Contributor
In die Datei foo.ser. Da ich hier kein verzeichnis angegeben habe sollte die im Arbeitsverzeichnis deiner Class-Datei liegen, kommt ganz auf deine IDE an.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Serialisierung - Sinn einer generierten serialVersionUID? Allgemeine Java-Themen 4
Z Serialisierung und Deserialisierung einer HashMap Allgemeine Java-Themen 17
antonia09 Einkaufszettel Persistenz und Serialisierung Allgemeine Java-Themen 6
D Serialisierung und Deserialisierung von Objekten - Frageprogramm Allgemeine Java-Themen 4
R Datentypen Korrekte integer in Hex ASCII Konvertierung und serialisierung Allgemeine Java-Themen 1
M Serialisierung funktioniert nicht Allgemeine Java-Themen 9
Z Best Practice Serialisierung Allgemeine Java-Themen 2
Arif Input/Output Serialisierung - Datei wird nicht erzeugt Allgemeine Java-Themen 3
M Alternative zur Serialisierung.. Protobuf? Allgemeine Java-Themen 9
E Serialisierung - Deserialisierung Allgemeine Java-Themen 4
Thallius Serialisierung schlägt fehl. Allgemeine Java-Themen 3
M Serialisierung & Verschlüsselung Allgemeine Java-Themen 2
V Serialisierung von Instanz eigener Klasse Allgemeine Java-Themen 5
A Input/Output Serialisierung und Object.hashCode() Allgemeine Java-Themen 3
Tobse Input/Output Dateiformat: Serialisierung VS Custom format Allgemeine Java-Themen 6
A Problem bei Serialisierung von Bibliotheks-Klassen Allgemeine Java-Themen 6
A Input/Output Serialisierung Sonderzeichen Allgemeine Java-Themen 3
P Serialisierung der Oberklasse Allgemeine Java-Themen 2
Kr0e Circular reference - Serialisierung Allgemeine Java-Themen 6
K Serialisierung in Properties-Datei möglich? Allgemeine Java-Themen 3
B Serialisierung mit Unterobjekten über Netzwerk Allgemeine Java-Themen 3
C Serialisierung - Standardwert für nachträglich hinzugefügtes Feld Allgemeine Java-Themen 2
S Serialisierung der Kindklasse Allgemeine Java-Themen 5
K Serialisierung komplett selbst machen Allgemeine Java-Themen 13
C Serialisierung ohne Serializable Allgemeine Java-Themen 4
S Serialisierung und Referenzen Allgemeine Java-Themen 6
S Viele Bilder -> Speicher ausgelastet? / (De-)serialisierung geht nicht mehr richtig Allgemeine Java-Themen 8
E Objekt bei Serialisierung ändern Allgemeine Java-Themen 2
Q Serialisierung / Speicherung Geschwindingkeit & Aktuelle Position Allgemeine Java-Themen 7
W Serialisierung Allgemeine Java-Themen 6
K Serialisierung von Hashmap in Vector Allgemeine Java-Themen 3
F Serialisierung und Obfuscation? Allgemeine Java-Themen 7
G (De)serialisierung und Referenzen Allgemeine Java-Themen 5
T Serialisierung: Wie macht RMI das so schnell? Allgemeine Java-Themen 14
J Serialisierung: readInt + writeInt Allgemeine Java-Themen 4
X Einige Fragen zu Serialisierung Allgemeine Java-Themen 2
J bean + serialisierung + serialVersionUID Allgemeine Java-Themen 3
K Serialisierung Allgemeine Java-Themen 6
thE_29 Wie funktioniert Serialisierung? Allgemeine Java-Themen 10
S Problem mit Serialisierung Allgemeine Java-Themen 2
C Serialisierung von JComboBox Allgemeine Java-Themen 4
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
T JNA, Aufruf der Funktionen einer dll Allgemeine Java-Themen 5
I Vom Monolith zu Services in einer Webseite Allgemeine Java-Themen 1
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
S HTML einer Webseite 1:1 so bekommen wie es auch der Browser anzeigt? Allgemeine Java-Themen 14
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
J (Geplante) Änderungen an einer Datei vorübergehend speichern und anwenden? Allgemeine Java-Themen 12
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
_user_q Obfuscate einer .jar-Datei mit ProGuard? Allgemeine Java-Themen 2
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
Zeppi NullPointerException in einer if-Abfrage Allgemeine Java-Themen 6
D Abbruch einer ViewScoped Bean in Arbeit Allgemeine Java-Themen 2
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
Lukas2904 Wie kann man cps (ClicksPerSecond) in einer GUI anzeigen lassen? Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
N BlueJ Implementation einer Analoguhr Allgemeine Java-Themen 0
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
N Speicherort einer Datei im Explorer ändern Allgemeine Java-Themen 8
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
J Zerlegen einer Zahl Allgemeine Java-Themen 6
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
MiMa Prüfziffer einer EAN Nummer berechnen Allgemeine Java-Themen 4
MiMa Erstellungsdatum einer Datei Allgemeine Java-Themen 10
Drachenbauer Wie kann ich einer existierenden Enum von außerhalb veränderte Werte zuweisen? Allgemeine Java-Themen 5
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
M Hilfe bei einer Java Programmieraufgabe! Ab morgen Montag um 08:00 Uhr Allgemeine Java-Themen 5
J Algorithmen Analyse einer Schleife Allgemeine Java-Themen 6
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben