2012-03-27 17 views
2

由於DirectedSparseGraph實現了可序列化(javadoc),爲什麼我不能創建圖形,將其序列化爲文件,然後將其反序列化?調用deserializer.readObject()時會引發「InvalidClassException」,並顯示消息「無效的構造函數」。JUNG的DirectedSparseGraph是否可串行化?

看着javadoc和源文件,它有一個零參數的構造函數。

這是一個庫中的錯誤?或者我錯過了什麼? 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(); 

例外:

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

您是否打算保存它的頂點,將它們保存在一個文件中,然後將它們從該文件加載到它們的最後狀態?如果是,請檢查'jung-samples-2.0.1.jar'中的'PersistentLayoutDemo.java'(使用它的'jung-samples-2.0.1-sources.jar')。 PersistentLayoutImpl.persist()方法實現PersistentLayout.persist()接口方法,並使用序列化的Point類保存頂點。 – 2012-03-28 01:12:53

回答

1

的構造函數實現 序列化類的唯一要求是,在其 的繼承層次結構中的第一個非序列化的超必須有一個無參數構造函數

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

在反序列化,非序列化類的字段將 使用公共或保護的 類的無參數的構造函數初始化。對於可序列化的子類,必須可訪問無參數構造函數。序列化子類的字段將從流中恢復爲 。

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

+0

因此,如果它擴展的類沒有無參數構造函數,那麼序列化它是不可能的?在那種情況下,爲什麼麻煩執行序列化?這是圖書館的錯誤嗎? – Crashthatch 2012-03-28 00:06:23

+2

當超類具有所需的構造函數時,它可能已經可序列化。另見[*項目74:明智地實現序列化*](http://java.sun.com/docs/books/effective/)。 – trashgod 2012-03-28 03:10:59

0

我使用XStream library序列DirectedSparseGraph。 即使對象沒有實現Serializable,也可以使用兩行代碼對對象進行序列化和反序列化,即。所以這在序列化第三方對象時特別有用,它們不能修改以使它們可序列化。

一旦你嘗試這個,你永遠不會回到本地Java序列化。 唯一的問題是XStream序列化爲XML,所以如果你有嚴格的性能要求,它不是最好的選擇。