Kryo反序列化失败,显示“KryoException: Buffer underflow”。

18

我使用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)?


我遇到了同样的问题?这个问题解决了吗? 我尝试了以下建议,但没有帮助... - Sharath
3个回答

18

当我没有正确关闭输出/输入类型时,这种情况也发生在我身上。您需要确保Kryo刷新所有内容,但要使用output.flush()output.close()

其次,请查看kryo.writeClassAndObject()。然后,您可以执行kryo.readClassAndObject()并将对象转换为其应该是的类型。


1
对我帮助很大!在我的情况下,我有 ByteArrayOutputStream stream1 = new ByteArrayOutputStream(); 和 Output output1 = Output(stream1)。目标是使用 kryo.writeClassAndObject(output, someObject); 将某些对象序列化为字节数组。重要的是在调用 stream1.toByteArray() 之前调用 output1.close(); 希望这能帮助某人节省时间并快速启动 Kryo! - Yurii Bratchuk
现代的Kryo在关闭之前会执行flush操作。 - guai
你指的是哪个现代的Kryo版本?@guai 这里的最新版本说: “当写入OutputStream时,输出缓冲区会缓存字节,因此在写入完成后必须调用flush或close来将缓冲的字节写入OutputStream。” https://github.com/EsotericSoftware/kryo#output - undefined
@coretechie 我的意思是,在关闭之前你不需要显式地刷新。 - undefined

5

我看到这个错误是由于一个真正的Java序列化问题引起的;我的类定义在生产者和消费者端(两个不同的应用程序)上不相同,因此我得到了这个异常。

如果你还没有检查过,请注意这一点。


4

当我在多个线程中使用序列化器时,发生了这种情况。它不是线程安全的,因此如果您以这种方式使用它,则可能会出现“缓冲区下溢”或其他异常。


这个想法在这里的回答中得到了印证: https://github.com/EsotericSoftware/kryo/issues/128#issuecomment-28249144 - Luke Machowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接