我尝试使用kryo序列化序列化quickfix.Message
实例。
我正在使用kryo 3.0.3版。
代码段如下:
Message fixMessage = getFixMessage();
Kryo kryo = new Kryo();
kryo.register(Message.class);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Output output = new Output(outputStream);
kryo.writeObject(output, fixMessage);
output.flush();
byte[] result = outputStream.toByteArray();
output.close();
ByteArrayInputStream inputStream = new ByteArrayInputStream(result);
Input input = new Input(inputStream);
Message fixMessage2 = kryo.readObject(input, Message.class);
我一直收到这个错误:
com.esotericsoftware.kryo.KryoException:无法创建类(缺少无参数构造函数):quickfix.StringField 序列化跟踪: 字段(quickfix.Message) at com.esotericsoftware.kryo.Kryo $ DefaultInstantiatorStrategy.newInstantiatorOf(Kryo.java:1272)~ [kryo-3.0.3.jar:?] 在com.esotericsoftware.kryo.Kryo.newInstantiator(Kryo.java:1078)〜[kryo-3.0.3.jar:?] 在com.esotericsoftware.kryo.Kryo.newInstance(Kryo.java:1087)〜[kryo-3.0.3.jar:?] at com.esotericsoftware.kryo.serializers.FieldSerializer.create(FieldSerializer.java:570)~ [kryo-3.0.3.jar:?] 在com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:546)〜[kryo-3.0.3.jar:?] at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:790)~ [kryo-3.0.3.jar:?] 在com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:161)〜[kryo-3.0.3.jar:?] 在com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:39)〜[kryo-3.0.3.jar:?] 在com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:708)〜[kryo-3.0.3.jar:?] 在com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:125)〜[kryo-3.0.3.jar:?] 在com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:551)〜[kryo-3.0.3.jar:?] 在com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:686)〜[kryo-3.0.3.jar:?]
如果我像这样注册kryo JavaSerializer
:
kryo.register(Message.class, new JavaSerializer());
我得到了这个:
com.esotericsoftware.kryo.KryoException:Java反序列化期间出错。 在com.esotericsoftware.kryo.serializers.JavaSerializer.read(JavaSerializer.java:65)〜[kryo-3.0.3.jar:?]
我开始认为这个对象根本无法使用kryo序列化......
对此问题的任何想法都将不胜感激。
答案 0 :(得分:0)
你的第一个错误是“无法创建类(缺少无参数构造函数)”,但我认为你解决了这个问题,这是第二个错误。第二个错误不是来自该行:
Message fixMessage2 = kryo.readObject(input, Message.class);
所以它确实序列化了并且越过了网络。你能展示更多的反序列化错误堆栈吗?
答案 1 :(得分:0)
n^2
对于所有序列化的类,您应该有一个no-arg构造函数。 如果不是您的课程且您无法更改,那么您应该创建自己的序列化程序,如this link