2016-05-09 58 views
1

問題在於,在查詢我的數據庫後,嘗試反序列化resultSet中返回的類itemSet的實例時。 blobfile本身似乎很好,數據可以保存到一個文件,然後使用filereader正確讀取(見下文),因此我傾向於認爲問題在於我的實現中的某個地方?該程序使用netbeans 8.01 ide在tomcat上運行。反序列化無效 - 從文件工作反序列化但不是blob?

我的項目的git鏈接:https://github.com/feltax/gw2apiMark2

我的項目是使用幾類修改包裝:https://github.com/feltax/gw2apiModified

確切的錯誤:

type Exception report message me.nithanim.gw2api.v2.api.items.ItemInfo; 
class invalid for deserialization 
description The server encountered an internal error that prevented it from fulfilling this request. 
exception java.io.InvalidClassException: me.nithanim.gw2api.v2.api.items.ItemInfo; class invalid for deserialization 
java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:150) 
java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:790) 
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1775) 
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) 
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2000) 
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1924) 
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) 
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) 
java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) 
Persistance.DbConnect.getItemSets(DbConnect.java:134) 
Servlets.TestServlet.doPost(TestServlet.java:84) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 

note the full stack trace of the root cause is available in the Apache Tomcat/8.0.27 logs. 

培訓相關代碼:(抱歉這是我第一次請求幫助,所以我不得不屠殺他們)

DB連接代碼:行出現問題134 github.com/feltax/gw2apiMark2/blob/master/src/main/java/Persistance/DbConnect.java

ItemInfo類: github.com/feltax/gw2apiModified/blob/master/src/main/java/me/nithanim/gw2api/v2/api/items/ItemInfo.java

套裝類: github.com/feltax/gw2apiMark2/blob/master/src/main/java/ItemSets/itemSet.java

我的數據庫: imgur.com/zfPLSsq

事情我已經嘗試:

串行UID聲明,確保所有類實現可串行化並具有生成的serialUid(也沒有serialUID)。

任何時候改變一個類,從而重新劃分存儲在其中的所有對象時,重新創建數據庫。

通過將文件保存到mysqlworkbench中的文件並使用下面的代碼讀取對象來確保blob文件是正確的。 itemSet正確讀取並且文件完全相同。 github.com/feltax/gw2apiMark2/blob/master/src/main/java/Persistance/apiDump.java

實施德壓縮輸入流:github.com/feltax/gw2apiMark2/blob/master/src/main/java/Persistance/DecompressibleInputStream.java

試圖序列和反序列化的字節數組,輸入流和使用get對象

最後我問Reddit上的幫助,但我並沒有真正得到遠。在這裏:www.reddit.com/r/learnprogramming/comments/4i68fj/java_class_invalid_for_de_serialization_error/

新的東西,現在我已經試過:

添加一個簡單的無參數的構造函數來basicItem和重建的代碼/數據庫,還是不幸得到同樣的錯誤。

public BasicItem() { 
    } 

- 建議感謝EJP

這樣一想,這會是是與出現在多個項目集的單個項目? java是否會產生一個問題,使之前已經解密的對象失去了deseralising?是

+0

'BasicItem'是否有可訪問的無參數構造函數? – EJP

+0

感謝您的回覆,BasicItem沒有無參數構造函數。我已經添加了一個簡單的(下面)重建項目並重新創建數據庫。不幸的是,它仍然給出了同樣的錯誤。 'public BasicItem(){}' –

+0

嗯,這就是消息通常表示的內容。我應該問最近的* non * -serializable父類是否有這樣的構造函數。 NB Java *喜歡*反序列化它已經反序列化的對象。它完全一般地處理循環對象圖。我想知道爲什麼你實際上序列化這些數據,而不是正確地將它映射到SQL中。 – EJP

回答

0
java.io.InvalidClassException: me.nithanim.gw2api.v2.api.items.ItemInfo; class invalid for deserialization 

在Javadoc提出的理由如下:

Thrown when the Serialization runtime detects one of the following problems with a Class.

  • The serial version of the class does not match that of the class descriptor read from the stream

在這種情況下,錯誤消息會這麼說,顯示出這兩個值。

  • The class contains unknown datatypes

我從來沒有見過這個,我不相信這是正確的。我期望這會導致ClassNotFoundException

  • The class does not have an accessible no-arg constructor.

這是不正確的。它應該說的是,類最接近的不可序列化的父類類沒有可訪問的無參數構造函數。我懷疑這是這種情況下的問題。 NB如果BasicItemSerializable它不需要這樣的構造函數。

+0

我不能夠感謝你。我已經將缺少的構造函數添加到父類,現在它正在工作。我將這個標記作爲一個答案,因爲它比我們的評論鏈更清晰。 –

+0

好奇,它與文件一起工作。我看不出這是怎麼一回事,所以我決定把它視爲誤報。 – EJP