使用Kryo序列化quickfix.Message

时间:2016-05-05 09:13:40

标签: java serialization quickfix kryo

我尝试使用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序列化......

对此问题的任何想法都将不胜感激。

2 个答案:

答案 0 :(得分:0)

你的第一个错误是“无法创建类(缺少无参数构造函数)”,但我认为你解决了这个问题,这是第二个错误。第二个错误不是来自该行:

Message fixMessage2 = kryo.readObject(input, Message.class);

所以它确实序列化了并且越过了网络。你能展示更多的反序列化错误堆栈吗?

答案 1 :(得分:0)

n^2

对于所有序列化的类,您应该有一个no-arg构造函数。 如果不是您的课程且您无法更改,那么您应该创建自己的序列化程序,如this link