2016-05-09 12 views
1

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?

+0

Hat 'BasicItem' einen barrierefreien No-Args-Konstruktor? – EJP

+0

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() {}' –

+0

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

Antwort

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

Die Gründe in der Javadoc fortgeschritten sind wie folgt:

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

In diesem Fall wird die Fehlermeldung so sagen würde, beide Werte zeigt.

  • The class contains unknown datatypes

Ich habe das nie gesehen und ich bin nicht überzeugt, dass es korrekt ist. Ich würde erwarten, dass das ClassNotFoundException verursacht.

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

Dies ist nicht korrekt. Was es sagen sollte, ist, dass die Klasse der nächsten nicht serialisierbaren übergeordneten Klasse keinen barrierefreien Konstruktor hat. Ich vermute das ist das Problem in diesem Fall. Hinweis: Wenn BasicItemSerializable ist, wird ein solcher Konstruktor nicht benötigt.

+0

Ich kann dir nicht genug danken. Ich habe den übergeordneten Klassen den fehlenden Konstruktor hinzugefügt und es funktioniert jetzt. Ich werde dies als eine Antwort markieren, da es klarer ist als die Kommentarkette, die wir hatten. –

+0

Neugierig, dass es mit der Datei funktioniert hat. Ich konnte nicht sehen, wie das sein konnte, also entschied ich mich, es als falsch positiv zu ignorieren. – EJP