【问题标题】:Serializing quickfix.Message with Kryo使用 Kryo 序列化 quickfix.Message
【发布时间】:2016-05-05 09:13:39
【问题描述】:

我正在尝试使用 kryo 序列化来序列化 quickfix.Message 实例。

我使用的是 kryo 3.0.3 版。

sn-p代码如下:

    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) 在 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:?] 在 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:?] 在 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 序列化...

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

【问题讨论】:

    标签: java serialization quickfix kryo


    【解决方案1】:

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

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

    所以它确实序列化并跨越了电线。你能展示更多的反序列化错误堆栈吗?

    【讨论】:

    • 错误堆栈的下一行是:Message fixMessage2 = kryo.readObject(input, Message.class);
    • 它在 StringField 上寻找一个非 args 构造函数,这是一个使用 Message 的类。两者都是 quickfix 包的类,我从外部 jar(不是我的代码)获得。我不应该(也不能)改变它。
    • 是的,但是您使用 JavaSerializer 修复了非 args 构造函数问题,现在问题在反序列化步骤中也是如此。有没有办法在readObject 上使用JavaDeserializer
    • 另一件事是质疑为什么您的利益相关者不允许您向 StringField 添加非 args 构造函数,它什么都不做,然后重新编译 QuickFix?很好的学习曲线。
    • 使用 JavaSerializer 没有帮助。我提到它是我尝试过但没有奏效的一件事。我试图找到一种更方便的方法,而不是提取、修复和重新编译第三方公共代码。也没有人保证一旦这个 StringFiled 问题得到解决,他们就不会在序列化这个 quickfix 包时出现任何其他问题。
    【解决方案2】:
    Class cannot be created (missing no-arg constructor): quickfix.StringField 
    

    您应该为所有被序列化的类提供一个无参数构造函数。 如果不是您的课程并且您无法更改它,那么您应该创建自己的序列化程序,如this link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      相关资源
      最近更新 更多