2012-03-27 11 views
2

Da DirectedSparseGraph serializable (javadoc) implementiert, warum kann ich kein Diagramm erstellen, es in eine Datei serialisieren und es dann deserialisieren? Eine "InvalidClassException" wird ausgelöst, wenn deserializer.readObject() mit der Nachricht "no valid constructor" aufgerufen wird.Ist JUNGs DirectedSparseGraph serialisierbar?

Betrachtet man die Javadoc- und Quelldateien, hat es einen Zero-arguments-Konstruktor.

Ist das ein Fehler in der Bibliothek? Oder fehlt mir etwas? Welche Art von Konstruktor erwartet Java?

DirectedSparseGraph graph = new DirectedSparseGraph(); 

    FileOutputStream underlyingStream = new FileOutputStream("output/temp.jung"); 
    ObjectOutputStream serializer = new ObjectOutputStream(underlyingStream); 
    serializer.writeObject(graph); 
    serializer.close(); 
    underlyingStream.close(); 

    FileInputStream underlyingStream2 = new FileInputStream("output/temp.jung"); 
    ObjectInputStream deserializer = new ObjectInputStream(underlyingStream2); 
    DirectedSparseGraph loadedGraph = (DirectedSparseGraph) deserializer.readObject(); //EXCEPTION THROWN HERE 
    deserializer.close(); 
    underlyingStream2.close(); 

Ausnahme:

Exception in thread "main" java.io.InvalidClassException: edu.uci.ics.jung.graph.DirectedSparseGraph; edu.uci.ics.jung.graph.DirectedSparseGraph; no valid constructor 
at java.io.ObjectStreamClass.checkDeserialize(Unknown Source) 
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
at java.io.ObjectInputStream.readObject0(Unknown Source) 
at java.io.ObjectInputStream.readObject(Unknown Source) 
at gui.GraphViewer.main(GraphViewer.java:39) 
Caused by: java.io.InvalidClassException: edu.uci.ics.jung.graph.DirectedSparseGraph; no valid constructor 
at java.io.ObjectStreamClass.<init>(Unknown Source) 
at java.io.ObjectStreamClass.lookup(Unknown Source) 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.writeObject(Unknown Source) 
at gui.GraphViewer.main(GraphViewer.java:33) 
+0

Haben Sie vor, seine Vertices zu speichern, sie in einer Datei zu speichern und sie später aus dieser Datei in ihren letzten Zustand zu laden? Wenn ja, markieren Sie 'PersistentLayoutDemo.java' in' jung-samples-2.0.1.jar' (mit 'jung-samples-2.0.1-sources.jar'). 'PersistentLayoutImpl.persist()' Methode implementiert 'PersistentLayout.persist()' Interface-Methode und verwendet eine serialisierte 'Point'-Klasse, um die Eckpunkte zu speichern. –

Antwort

1

Die einzige Anforderung an den Konstruktor für eine Klasse, die Serializable implementiert ist, dass die erste nicht-serialisierbaren Super in seiner inheritence Hierarchie ein No-Argument haben muss Erbauer

Quelle: http://www.jguru.com/faq/view.jsp?EID=251942

Bei der Deserialisierung der Felder nicht serialisierbaren Klassen mit dem öffentlichen oder nicht-arg Konstruktor der Klasse geschützt initialisiert werden. Auf die Unterklasseserialisierbar muss ein Konstruktor ohne Argon zugreifen können. Die Felder der serialisierbaren Unterklassen werden aus dem Stream wiederhergestellt.

Quelle: http://docs.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html

+0

Also, wenn die Klasse, die es erweitert, keinen Konstruktor ohne Argumente hat, ist es unmöglich, es zu serialisieren? Warum sollten Sie Serializable in diesem Fall implementieren? Ist das ein Fehler in der Bibliothek? – Crashthatch

+2

Es könnte zu einer Zeit serialisierbar gewesen sein, als die Oberklasse den erforderlichen Konstruktor hatte. Siehe auch [* Item 74: Implementieren Sie Serializable umsichtig *] (http://java.sun.com/docs/books/effective/). – trashgod

0

ich serialisiert DirectedSparseGraph die XStream library verwenden. Sie serialisieren und deserialisieren Objekte mit 2 Codezeilen, , auch wenn die Objekte Serializable nicht implementieren. Dies ist besonders nützlich, wenn Sie Objekte von Drittanbietern serialisieren, die Sie nicht modifizieren können, um sie serialisierbar zu machen.

Sobald Sie dies versuchen, kommen Sie nie wieder zur nativen Java-Serialisierung. Das einzige Problem ist, dass XStream nach XML serialisiert. Wenn Sie also strenge Leistungsanforderungen haben, ist dies nicht die beste Wahl.