用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();
}
然后就顺利通过啦!!!
在使用Kryo进行序列化和反序列化时,遇到了在反序列化过程中抛出的KryoException:Bufferunderflow错误。问题出在循环读取对象时,输入流input在读取最后一个对象后没有正确停止。通过检查input的position和limit,在两者相等时退出循环解决了问题,从而避免了Bufferunderflow异常。
2万+

被折叠的 条评论
为什么被折叠?



