2016-05-09 9 views
1

データベースを照会した後にresultSetで返されたクラスitemSetのインスタンスを逆シリアル化しようとすると問題が発生します。 blobファイル自体は問題ないと思われ、データをファイルに保存してからfilereaderを使って正しく読み込むことができます(下記参照)。私の実装のどこかに問題があると思うでしょうか?このプログラムは、netbeans 8.01 ideを使用してtomcatで実行されます。デシリアライズのためのクラスが無効です - ファイルは動作しますがブロブはデシリアライズされませんか?

マイプロジェクト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. 

Releventコード:について(申し訳ありませんリンク、これは私が助けを求めたので初めてのことです)

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も含まれません)。

私はクラスを変更して、その中に格納されているすべてのオブジェクトを再疎水化するたびにデータベースを再作成します。

blobファイルが正しいことを確認するには、mysqlworkbenchのファイルに保存し、以下のコードでオブジェクトを読み込みます。 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に助けを求めたが、私は実際に取得していません遠いここではまだ、残念ながら同じエラーを取得し、basicItemへの単純な引数なしのコンストラクタを追加し、コード/データベースの再構築

www.reddit.com/r/learnprogramming/comments/4i68fj/java_class_invalid_for_de_serialization_error/

新しい私が今しようとしている事を。

public BasicItem() { 
    } 

- 思想としてEJP

への提案のおかげで、これは、複数の項目セットに登場する単一の項目とは何かだろうか? Javaは以前にすでに脱灰されているオブジェクトを脱塩する問題がありますか?次のような理由は、Javadocの前進

+0

'BasicItem'はアクセス可能な引数なしのコンストラクタを持っていますか? – EJP

+0

返信いただきありがとうございます.BaseItemには引数なしコンストラクタがありませんでした。私は単純なプロジェクト(以下)を追加してプロジェクトを再構築し、データベースを再作成しました。残念ながら、それはまだ同じエラーを与えています。 'public BasicItem(){}' –

+0

これは、メッセージが通常示すとおりです。私は、最も近い*非*直列化可能な親クラスがそのようなコンストラクタを持っているかどうか尋ねたはずです。 NB Java *は既にデシリアライズしたオブジェクトを逆シリアル化するのが大好きです。それは完全な一般性において循環オブジェクトグラフを扱う。なぜ私はあなたが実際には、SQLに正しくマッピングするよりも、このデータをシリアル化しているのだろうかと思います。 – EJP

答えて

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

は、次のとおり

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.

これは正しくありません。クラスのに最も近い直列化不可能な親のクラスには、引数なしのコンストラクタがありません。私はそれがこの場合の問題だと思う。注意BasicItemSerializableの場合、そのようなコンストラクタは必要ありません。

+0

ありがとうございます。私は親クラスに欠けているコンストラクタを追加しました。私は、私たちが持っていたコメントチェーンよりも明確に答えとしてマークします。 –

+0

ファイルと一緒に働いているのが面白いです。私はそれが本当のことができる方法を見ることができなかったので、私はそれを偽陽性として無視することに決めました。 – EJP

関連する問題