Serialisieren mehrerer Klassen scheitert - warum?

J-C

Mitglied
Hallo,

ich habe 3 Klassen, die alle miteinander Verbunden sind:

Klasse 1 - Netz - enthält eine Hashmap<String, Knoten> aller Knoten mit einem Schlüßel

Klasse 2 - Halte- enthält eine Hashmap<Halte, Kante> aller verbundenen Knoten und Kanten, die die Kante genauer beschreiben

Klasse 3 - Kanten - enthält unter anderem die entfernung + weitere attribute

Wenn ich das Netz serialisieren will, erhalte ich folgende Exceptions

Code:
Exception in thread "main" java.lang.StackOverflowError
    at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
    at java.util.HashMap.writeObject(HashMap.java:1001)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:416)
    at mapapp.datatypes.DtHalt.writeObject(DtHalt.java:86)
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
    at 

So ich kürz das hier mal ab, obwohl noch ca. 60.000 Zeichen kommen ;)

Was mache ich falsch?

Es funktioniert, wenn ich in der Klasse Halte nicht die verbunden Halte sondern nur deren Schlüßel speichere... nur ist das uneffektiv, da ich bei jedem zugriff dann die Halte erst wieder aus der HashMap des Netzes holen muss.

Meine Vermutung: Irgendwie kommt er damit nicht klar eine simple Referenz auf das Objekt Halt, das ja schon im Netz serialisiert wurde zu speichern, wenn die verbundenen Knoten gespeichert werden sollen.

Für Hilfe wäre ich sehr dankbar :)
 
In deinem Stacktrace solltest du dann ja sehen dass irgendeine Methode immer wieder aufgerufen wird.

Serialisierung mit Java ist vielleicht nicht die richtige Wahl. XStream bietet die Möglichkeit Objekte nach XML zu speichern (und von da zu laden) und unterstützt auch die Referenzierung wenn ein Objekt mehrfach vorkommt. Dafür musst du nur etwa 3 Zeilen Code schreiben.
 
Mit folgender Zeile endet immer die Exception und fängt wieder an.

Code:
at java.util.HashMap.writeObject(HashMap.java:1001)

Ich werde mir XStream mal anschauen. Obwohl ich denke, dass es eigentlich auch einfacher gehen müsste...
 
Also bis jetzt gefällt mir XStream - nur sind die Dateien wirklich sehr groß Eigentlich schon zu groß ... :(
 
Vieeel zu groß!

mittels java serialisierung sind es gute 3mb
mit Xstream sind es knapp 30mb - irgendwie ist das nicht der richtige Weg
 
Na du kannst sie ja noch wesentlich kleiner kriegen, indem du XStream noch ein wenig konfigurierst. Wenn die Elementnamen kleiner sind, dann ist die Datei auch wesentlich kleiner. Einrückungen kann man z.B. auch weglassen. Welchen Modus hast du denn verwendet? Je nachdem wirds auch größer oder kleiner.

Andere Möglichkeit: Einmal zippen danach. Dann sollte es auch schön klein sein.
 
Ich denke das Problem ist folgendes

Halt A ist verbunden mit Halt B und Halt B ist mit Halt C verbunden und Halt C wieder mit A ... und so versucht er die Objekte im Kreis immer nacheinander zu serialisieren...

oder irre ich mich?
 
Beim Serialisieren ja.

XStream sollte das entsprechend merken. Wie hast du es denn konfiguriert? Poste doch mal den Code.
 
ich hab nix weiter gemacht...
xstream objekt
file und buffered writer und ab mit der toXML Funktion
 
Zurück