2016-05-05 118 views
0

我試圖使用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連載...

對這個問題的想法將非常感激。

回答

0

您的第一個錯誤是「無法創建類(缺少無參數構造函數)」,但我認爲您已經解決了這個問題,並且是第二個錯誤。沒有第二個錯誤來自行:

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

所以才連載,並通過線路獲得。你能展示更多的反序列化錯誤堆棧嗎?

+0

錯誤堆棧中的下一行是:Message fixMessage2 = kryo.readObject(input,Message.class); – theDima

+1

它正在尋找StringField上的非參數構造函數,它是使用Message的類。兩者都是quickfix包的類,我從外部jar(不是我的代碼)獲得。我不應該(也不能)改變它。 – theDima

+0

是的,但是您使用該'JavaSerializer'修復了非參數構造函數問題,現在問題在反序列化步驟中也是如此。有沒有辦法在'readObject'上使用'JavaDeserializer'? – rupweb

0
Class cannot be created (missing no-arg constructor): quickfix.StringField 

對於序列化的所有類,您應該有一個無參數構造函數。 如果不是你的班級,你不能改變它,那麼你應該創建你自己的序列化程序,如this link