データベースを照会した後に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の前進
'BasicItem'はアクセス可能な引数なしのコンストラクタを持っていますか? – EJP
返信いただきありがとうございます.BaseItemには引数なしコンストラクタがありませんでした。私は単純なプロジェクト(以下)を追加してプロジェクトを再構築し、データベースを再作成しました。残念ながら、それはまだ同じエラーを与えています。 'public BasicItem(){}' –
これは、メッセージが通常示すとおりです。私は、最も近い*非*直列化可能な親クラスがそのようなコンストラクタを持っているかどうか尋ねたはずです。 NB Java *は既にデシリアライズしたオブジェクトを逆シリアル化するのが大好きです。それは完全な一般性において循環オブジェクトグラフを扱う。なぜ私はあなたが実際には、SQLに正しくマッピングするよりも、このデータをシリアル化しているのだろうかと思います。 – EJP