2016-05-05 4 views
0

Я пытаюсь сериализовать экземпляр 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'S 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

Ваша первая ошибка говорит: «Класс не может быть создан (отсутствует конструктор no-arg)», но я думаю, что вы обошли это, и это вторая ошибка. Не исходит ли 2-я ошибка от линии:

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

поэтому он сериализовал и прошел через провод. Можете ли вы показать больше стека ошибок десериализации?

+0

Следующая строка в стеке ошибок: Сообщение fixMessage2 = kryo.readObject (input, Message.class); – theDima

+1

Он ищет конструктор non args на StringField, который является классом, использующим Message. Оба являются классами пакета fastfix, которые я получаю из внешнего баннера (а не моего кода). Я не должен (и не могу) изменить его. – theDima

+0

да, но вы исправили проблему конструктора non args с помощью этого 'JavaSerializer', и теперь проблема делает то же самое на шаге десериализации. Есть ли способ использовать 'JavaDeserializer' в' readObject'? – rupweb

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

У вас должен быть конструктор no-arg для всех классов, которые сериализованы. Если это не ваш класс, и вы не можете его изменить, тогда вы должны создать свой собственный сериализатор, как в this link