2009-03-24 16 views
5

をシリアル化できません。は、私は内部のオブジェクトの配列リストをシリアライズとデシリアライズしようとしている/デシリアライズのArrayList

このコードの実行には、次のエラーを返して:行の

java.io.InvalidClassException: java.util.ArrayList; local class incompatible: stream classdesc serialVersionUID = 8664875232659988799, local class serialVersionUID = 8683452581122892189

paramDecoded = (ArrayList<HairBirt>) obj_in.readObject();

私は私が間違ってやっているのか分かりません。あなたはチップを与えることができますか?

更新:

は解決済み: は、だけではなく、ArrayListののHairBirtのネイティブ配列を使用し、それが動作します:

HairBirt[] list = new HairBirt[x]; 

代わりの

ArrayList<HairBirt> list = new ArrayList<HairBirt>(); 

ありがとうございましたあなたの助け。

答えて

9

ByteArrayOutputStream.toString()を使用しないでください。toByteArray()を使用し、バイナリデータをbase64エンコードして情報を失うことなく文字列に変換します。

私は強く、シリアル化の後にデータを失っているという主な問題だと思っています。 ObjectOutputStreamを閉じたり、少なくともフラッシュしてください。この場合、実際に何かをするかどうかはわかりませんが、それは良い考えです。

私はbase64のサポートがJavaに直接(publicなクラスでは)とは思えませんが、the one in the Apache Commons Codec libraryのような、利用できるサードパーティ製のさまざまなライブラリがあります。

+0

うん、それは問題ですが、私は本当にその動きにStringを使う必要があります。これは本当の問題ではなく、単純化しています。 – sakana

+0

「その動きで」とはどういう意味ですか?デシリアライズできるようにするには、BAOSを無損失の方法で文字列に変換する必要があります。それがbase64であるかどうかは別の問題ですが、それを行う良い方法だと思います。 –

+0

@sakana:base64は、文字セットが制限された文字列形式です。 – Powerlord

0

カスタムクラスで独自のserialVersionUIDを宣言してこの動作をオーバーライドしましたか?

文字列を使ってシリアル化する特別な手順はありますか?通常は、ObjectOutputStreamを介してデシリアライズします。

+0

ここではserialVersionUIDを宣言しても意味がありません。 –