Java Kryo序列化/反序列化
我正在尝试使用kryo将其序列化和反序列化为二进制。我想我的序列化工作,但我似乎不能反序列化。下面是我正在处理的代码,但最终我想存储一个字节[],然后再次读取。文档仅显示如何使用文件执行此操作Java Kryo序列化/反序列化,java,kryo,Java,Kryo,我正在尝试使用kryo将其序列化和反序列化为二进制。我想我的序列化工作,但我似乎不能反序列化。下面是我正在处理的代码,但最终我想存储一个字节[],然后再次读取。文档仅显示如何使用文件执行此操作 Kryo kryo = new Kryo(); kryo.register(ArrayList.class); kryo.register(Modifier.class); ByteArrayOutputStream b = new Byt
Kryo kryo = new Kryo();
kryo.register(ArrayList.class);
kryo.register(Modifier.class);
ByteArrayOutputStream b = new ByteArrayOutputStream();
Modifier modifier = new Modifier();
modifier.type = "Yo swa!";
modifier.amount = 10;
Output output = new Output(b);
kryo.writeClassAndObject(output, modifier);
System.out.println("Kryo size: " + output.toBytes().length);
Input input = new Input(output.getBuffer());
//Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 11, Size: 0
Modifier r = kryo.readObject(input, Modifier.class);
//Same error:
Modifier r = kryo.readObject(new Input(new ByteArrayInputStream(output.toBytes())), Modifier.class);
System.out.println(r.type);
您通过
writeClassAndObject
方法进行序列化,并通过readObject
进行反序列化,这两种方法不兼容
您应该使用writeClassAndObject
=>readClassAndObject
或writeObject
=>readObject
以下内容对我很有用(kryo版本2.21)
writeObject
=>readObject
package test;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
public class TestMain {
public static void main(String[] args) {
Kryo kryo = new Kryo();
kryo.register(ArrayList.class);
kryo.register(Modifier.class);
ByteArrayOutputStream b = new ByteArrayOutputStream();
Modifier modifier = new Modifier();
modifier.type = "Yo swa!";
modifier.amount = 10;
Output output = new Output(b);
kryo.writeObject(output, modifier);
output.flush();
output.close();
System.out.println("Kryo size: " + output.toBytes().length);
Input input = new Input(output.getBuffer());
Modifier r = kryo.readObject(input, Modifier.class);
System.out.println(r.type);
}
static class Modifier {
String type;
int amount;
}
}
package test;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
public class TestMain {
public static void main(String[] args) {
Kryo kryo = new Kryo();
kryo.register(ArrayList.class);
kryo.register(Modifier.class);
ByteArrayOutputStream b = new ByteArrayOutputStream();
Modifier modifier = new Modifier();
modifier.type = "Yo swa!";
modifier.amount = 10;
Output output = new Output(b);
kryo.writeClassAndObject(output, modifier);
output.flush();
output.close();
System.out.println("Kryo size: " + output.toBytes().length);
Input input = new Input(output.getBuffer());
Modifier r = (Modifier) kryo.readClassAndObject(input);
System.out.println(r.type);
}
static class Modifier {
String type;
int amount;
}
}
writeClassAndObject
=>readClassAndObject
package test;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
public class TestMain {
public static void main(String[] args) {
Kryo kryo = new Kryo();
kryo.register(ArrayList.class);
kryo.register(Modifier.class);
ByteArrayOutputStream b = new ByteArrayOutputStream();
Modifier modifier = new Modifier();
modifier.type = "Yo swa!";
modifier.amount = 10;
Output output = new Output(b);
kryo.writeObject(output, modifier);
output.flush();
output.close();
System.out.println("Kryo size: " + output.toBytes().length);
Input input = new Input(output.getBuffer());
Modifier r = kryo.readObject(input, Modifier.class);
System.out.println(r.type);
}
static class Modifier {
String type;
int amount;
}
}
package test;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
public class TestMain {
public static void main(String[] args) {
Kryo kryo = new Kryo();
kryo.register(ArrayList.class);
kryo.register(Modifier.class);
ByteArrayOutputStream b = new ByteArrayOutputStream();
Modifier modifier = new Modifier();
modifier.type = "Yo swa!";
modifier.amount = 10;
Output output = new Output(b);
kryo.writeClassAndObject(output, modifier);
output.flush();
output.close();
System.out.println("Kryo size: " + output.toBytes().length);
Input input = new Input(output.getBuffer());
Modifier r = (Modifier) kryo.readClassAndObject(input);
System.out.println(r.type);
}
static class Modifier {
String type;
int amount;
}
}
我认为您需要在某个地方指定字节大小,就像分配数组一样。什么是
b
?@Dici是ByteArrayOutputStream。如果我设置一个输入流,比如字节[100],我会在同一行的线程“main”java.lang.ArrayIndexOutOfBoundsException:-2中得到一个异常。你应该使用toBytes
而不是getBuffer
(参见文档),但我认为这不是导致问题的原因。第一个println
显示什么?@dici数组的大小(13)。这是对的吗?我正在序列化的类包含另一个int。@dici我将错误行更改为:Modifier r=kryo.readObject(新输入(新ByteArrayInputStream(output.toBytes()),Modifier.class)代码>仍然是相同的错误。。