web-dev-qa-db-ja.com

Kryoの逆シリアル化が「KryoException:バッファアンダーフロー」で失敗する

私はKryoを使用してオブジェクトをバイト配列に書き込みます。それはうまくいきます。ただし、バイト配列がオブジェクトに変換されると、com.esotericsoftware.kryo.KryoException: Buffer underflow.例外がスローされます。

これは私の逆シリアル化です:

        Kryo k=new Kryo();
        Input input=new Input(byteArrayOfObject);           
        Object o=k.readObject(input,ObjectClass.class);

さらに、私のアプリケーションでは常にオブジェクトタイプを定義することはできません。最終プロセスで、クラス変換が行われます。したがって、

  • 上記の逆シリアル化エラーを解決するにはどうすればよいですか?

  • クラスをreadObject(...、ClassName)に渡さずにオブジェクトを作成する方法はありますか?

14
Débora

これは、出力/入力タイプを正しく閉じていなかったときに発生しました。 Kryoがoutput.flush()またはoutput.close()を実行する以外はすべてフラッシュすることを確認する必要があります。

次に、kryo.writeClassAndObject()を調べます。次に、kryo.readClassAndObject()を実行して、オブジェクトを想定されているタイプにキャストできます。

12
sydraz

真のJavaシリアル化の問題。クラス定義がプロデューサー側とコンシューマー側(2つの異なるアプリケーション)で同じではなかったため、このエラーが発生しました。その結果、この例外が発生しました。

まだチェックしていない場合は、これを参考までに残したかっただけです。

3
cwash

これは、シリアライザーを複数のスレッドで使用したときに発生しました。スレッドセーフではないため、このように使用すると、「バッファアンダーフロー」またはその他の例外が発生する可能性があります。

2
Henry Hu