Ich habe versucht, die Standard-Serialisierung Art Dinge verwenden, Sachen wie:Gibt es eine Möglichkeit, ein Grafikobjekt mit Knoten und Kanten zu speichern?
FileOutputStream f_out;
try {
f_out = new FileOutputStream("MAOS.data");
ObjectOutputStream obj_out = new ObjectOutputStream (f_out);
obj_out.writeObject(s);
obj_out.flush();
obj_out.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} ;
Aber das Problem scheint zu sein, dass, wenn mein Objekt s jede Rekursion bei ALL I enthält einen Stapelüberlauf zu bekommen. Wenn s ein Graph ist, der Knoten und Kanten enthält (mit Knoten, die über Kanten wissen, um die Aktivierung zu verteilen, und Kanten, die aus demselben Grund Knoten kennen), dann stapeln sie einen Stapel. Wenn ich Kanten ganz herausnehme und nur Knoten habe, die wissen, über welche Knoten sie die Aktivierung auch verbreiten sollen, passiert das Gleiche! Ich kann sogar versuchen, die ArrayList der Knoten zu speichern, die der Graph kennt, und der Stapel läuft wieder über!
Ich bin so frustriert!
Graphen sind nicht gerade seltsam und mysteriös, sicherlich wollte jemand einen vor mir retten. Ich sehe etwas über das Speichern von ihnen als XML-Dateien hier ... aber wenn mein Problem die Rekursivität ist, würde ich immer noch die gleichen Probleme haben, selbst wenn ich es anders gespeichert habe? Ich kann mir einfach nicht vorstellen, wie man eine Grafik machen kann, ohne dass es Verbindungen gibt!
Mache ich nur Dinge falsch, oder ist diese Objektserialisierung weniger stark als ich dachte? Oder muss ich die Idee, ein Diagramm zu speichern, einfach aufgeben?
-Jenny
bearbeiten, Teil des riesigen Stack-Trace:
Exception in thread "main" java.lang.StackOverflowError
at java.io.ObjectStreamClass.getPrimFieldValues(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.ArrayList.writeObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.ArrayList.writeObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.ArrayList.writeObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.ArrayList.writeObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
Hmm .... das ist eine wirklich gute Idee. Meine einzige Sorge ist, wird das nicht wirklich Auswirkungen auf die Laufzeit haben, wenn ich nach Graphen jedes Mal, wenn etwas getan werden muss, durch alle Knoten und Kanten suchen muss? Im Moment ist es eine Arraylist, um einen Knoten mit einer bestimmten ID zu finden, müsste ich die ganze Sache durchlaufen, im schlimmsten Fall gehe ich durch jeden Knoten (oder Rand), der Hunderttausende sein könnte! Sind Tabellen schneller? – Jenny
* Hash-Tabellen, meinte ich. – Jenny
Ja, sie sind O (1) – Hejazzman