問題在於,在查詢我的數據庫後,嘗試反序列化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
套裝類: 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?是
'BasicItem'是否有可訪問的無參數構造函數? – EJP
感謝您的回覆,BasicItem沒有無參數構造函數。我已經添加了一個簡單的(下面)重建項目並重新創建數據庫。不幸的是,它仍然給出了同樣的錯誤。 'public BasicItem(){}' –
嗯,這就是消息通常表示的內容。我應該問最近的* non * -serializable父類是否有這樣的構造函數。 NB Java *喜歡*反序列化它已經反序列化的對象。它完全一般地處理循環對象圖。我想知道爲什麼你實際上序列化這些數據,而不是正確地將它映射到SQL中。 – EJP