com.esotericsoftware.kryo.KryoException: Buffer underflow. 解决

在使用Kryo进行序列化和反序列化时,遇到了在反序列化过程中抛出的KryoException:Bufferunderflow错误。问题出在循环读取对象时,输入流input在读取最后一个对象后没有正确停止。通过检查input的position和limit,在两者相等时退出循环解决了问题,从而避免了Bufferunderflow异常。

用kryo进行序列化和反序列化的时候,序列化的过程很顺利,反序列化的过程中遇到报错KryoException: Buffer underflow. 代码如下:

//其中path是将序列化对象保存的路径,Module是自己定义的类,以下是序列化的代码
private void writeIn(String path, List<Module> modules) throws IOException {
        //用kryo序列化
        FileOutputStream fos = new FileOutputStream(path);
        Output output = new Output(fos);
        for (Module m : modules){
            this.kryo.writeClassAndObject(output, m);
        }
        output.flush();
        output.close();
    }

//以下是反序列化的代码,由于我在序列化对象的一个文件中存储了多个类,所以需要循环反序列化
private void readIn(String path) throws IOException{
        //用kryo序列化
        FileInputStream fis = new FileInputStream(path);
        Input input = new Input(fis);
        List<Module> modList = new ArrayList<>();
        Module mod;
        while ((mod = (Module) this.kryo.readClassAndObject(input))!=null){
            modList.add(mod);
        }
        input.close();
    }

在循环中设置了断点,调试了一下,发现是因为input已经读完,但是readClassAndObject还未停止,所以报错如下:

com.esotericsoftware.kryo.KryoException: Buffer underflow.
	at com.esotericsoftware.kryo.io.Input.require(Input.java:219)
	at com.esotericsoftware.kryo.io.Input.readVarInt(Input.java:407)
	at com.esotericsoftware.kryo.util.DefaultClassResolver.readClass(DefaultClassResolver.java:145)
	at com.esotericsoftware.kryo.Kryo.readClass(Kryo.java:758)
	at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:869)

查了一下发现input在读到最后一个对象时,其position值和limit值相等,因此可以作为判断条件跳出循环,在读到最后一个对象后终止反序列化。

  …… 

 修改后反序列化代码如下:

private void readIn(String path) throws IOException{
        //用kryo序列化
        FileInputStream fis = new FileInputStream(path);
        Input input = new Input(fis);
        List<Module> modList = new ArrayList<>();
        while (true){
            Module mod = (Module) this.kryo.readClassAndObject(input);
            modList.add(mod);
            //添加对input的判断,在读入终止时结束反序列化
            if (input.position() == input.limit()){
                break;
            }
        }
        input.close();
    }

 然后就顺利通过啦!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值