我试图使用kryo序列化序列化一个quickfix.Message
实例。使用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: Class cannot be created (missing no-arg constructor): quickfix.StringField Serialization trace: fields (quickfix.Message) at com.esotericsoftware.kryo.Kryo$DefaultInstantiatorStrategy.newInstantiatorOf(Kryo.java:1272) ~[kryo-3.0.3.jar:?] at com.esotericsoftware.kryo.Kryo.newInstantiator(Kryo.java:1078) ~[kryo-3.0.3.jar:?] at 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:?] at 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:?] at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:161) ~[kryo-3.0.3.jar:?] at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:39) ~[kryo-3.0.3.jar:?] at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:708) ~[kryo-3.0.3.jar:?] at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:125) ~[kryo-3.0.3.jar:?] at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:551) ~[kryo-3.0.3.jar:?] at 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: Error during Java deserialization. at com.esotericsoftware.kryo.serializers.JavaSerializer.read(JavaSerializer.java:65) ~[kryo-3.0.3.jar:?]
我开始认为这个对象根本无法使用KRYO连载...
对这个问题的想法将非常感激。
错误堆栈中的下一行是:Message fixMessage2 = kryo.readObject(input,Message.class); – theDima
它正在寻找StringField上的非参数构造函数,它是使用Message的类。两者都是quickfix包的类,我从外部jar(不是我的代码)获得。我不应该(也不能)改变它。 – theDima
是的,但是您使用该'JavaSerializer'修复了非参数构造函数问题,现在问题在反序列化步骤中也是如此。有没有办法在'readObject'上使用'JavaDeserializer'? – rupweb