Das Problem liegt beim Versuch, eine Instanz der in einem resultSet zurückgegebenen Klasse itemSet nach dem Abfragen meiner Datenbank zu deserialisieren. Die Blobdatei scheint in Ordnung zu sein und die Daten können in einer Datei gespeichert werden, die dann mit einem FileReader korrekt gelesen wird (siehe unten). Ich bin geneigt zu glauben, dass das Problem irgendwo in meiner Implementierung liegt. Das Programm läuft auf Tomcat mit der Netbeans 8.01 IDE.Klasse für Deserialisierung ungültig - Deserialisiert von Datei funktioniert, aber nicht Blob?
Mein Projekt git Link: https://github.com/feltax/gw2apiMark2
Mein Projekt eine modifizierte Wrapper für einige Klassen verwendet: https://github.com/feltax/gw2apiModified
Der genaue Fehler:
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.
Relevent Code: (sorry about die Links, dies ist das erste Mal, dass ich um Hilfe gebeten habe, so musste ich sie schlachten)
DB Anschluss-Code: Problem tritt auf der Leitung 134 github.com/feltax/gw2apiMark2/blob/master/src/main/java/Persistance/DbConnect.java
ItemInfo Klasse: github.com/feltax/gw2apiModified/blob/master/src/main/java/me/nithanim/gw2api/v2/api/items/ItemInfo.java
Itemset Klasse: github.com/feltax/gw2apiMark2/blob/master/src/main/java/ItemSets/itemSet.java
meine Datenbank: imgur.com/zfPLSsq
Dinge, die ich versucht habe:
Serielle UID-Deklaration, die sicherstellt, dass alle Klassen serialisierbar sind und eine generierte serialUid (auch ohne serialUID) haben.
Die Datenbank kann jedes Mal neu erstellt werden, wenn ich eine Klasse ändere und alle darin gespeicherten Objekte erneut veröffentliche.
Stellen Sie sicher, dass die BLOB-Datei korrekt ist, indem Sie sie in mysqlworkbench in Datei speichern und dann das Objekt mit dem folgenden Code einlesen. Das itemSet wurde korrekt eingelesen und die Dateien waren identisch. github.com/feltax/gw2apiMark2/blob/master/src/main/java/Persistance/apiDump.java
Implementierung von De-komprimierbaren Eingangsstrom: github.com/feltax/gw2apiMark2/blob/master/src/main/java/Persistance/DecompressibleInputStream.java
Der Versuch, Byte-Array zu serialisiert und deserialisiert, Bäche Eingang und mit get Objekt
Schließlich bat ich um Hilfe zu reddit, aber ich habe wirklich nicht bekommen weit. hier: www.reddit.com/r/learnprogramming/comments/4i68fj/java_class_invalid_for_de_serialization_error/
Neue Dinge, die ich jetzt versucht:
einen einfachen No-args Konstruktor basicItem und der Wiederaufbau den Code/Datenbank hinzufügen, leider noch die gleichen Fehler.
public BasicItem() {
}
- Anregung dank EJP
Als Gedanke, könnte dies etwas sein, mit einem einzigen Artikel in mehreren Artikelmengen erscheinen zu tun? Hat Java ein Problem, ein Objekt zu deseralisieren, das bereits zuvor deseralisiert wurde?
Hat 'BasicItem' einen barrierefreien No-Args-Konstruktor? – EJP
Danke für die Antwort, BasicItem hatte keinen No-Args-Konstruktor. Ich habe eine einfache (unten) hinzugefügt, um das Projekt neu zu erstellen und die Datenbank neu erstellt. Leider gibt es immer noch den gleichen Fehler. 'public BasicItem() {}' –
Hmm, das ist, was die Nachricht normalerweise anzeigt. Ich hätte fragen sollen, ob die nächste * nicht * -serialisierbare Elternklasse einen solchen Konstruktor hat. NB: Java * liebt * das Deserialisieren von Objekten, die es bereits deserialisiert hat. Es behandelt zyklische Objektgraphen in voller Allgemeinheit. Ich frage mich, warum Sie diese Daten tatsächlich seriell serialisieren, anstatt sie ordnungsgemäß in SQL abzubilden. – EJP