2016-05-05 3 views
0

Ich versuche, eine quickfix.Message Instanz mit Kryo-Serialisierung zu serialisieren.Serialisierung quickfix.Message mit Kryo

Ich benutze kryo Version 3.0.3.

Der Code-Snippet wird wie folgt:

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); 

und ich halte diesen Fehler:

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:?]

, wenn ich eine Kryo der JavaSerializer wie folgt registrieren:

kryo.register(Message.class, new JavaSerializer()); 

ich dieser:

com.esotericsoftware.kryo.KryoException: Error during Java deserialization. at com.esotericsoftware.kryo.serializers.JavaSerializer.read(JavaSerializer.java:65) ~[kryo-3.0.3.jar:?]

ich anfangen zu denken, dass diese Aufgabe nicht einfach Kryo serialisiert werden mit ...

Irgendwelche Gedanken zu diesem Thema wird sehr geschätzt.

Antwort

0

Ihr erster Fehler sagt "Klasse kann nicht erstellt werden (fehlender no-arg-Konstruktor)", aber ich denke, dass Sie das verstanden haben und es der 2. Fehler ist, der das Problem ist. Kommt der 2. Fehler nicht von der Zeile:

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

so war es Serialisierung und über den Draht. Können Sie mehr des Deserialisierungsfehlerstapels anzeigen?

+0

erstellen Die nächste Zeile im Fehler-Stack ist: Nachricht fixMessage2 = kryo.readObject (input, Message.class); – theDima

+1

Es sucht nach einem Nicht-Argument-Konstruktor in StringField, einer Klasse, die in Message verwendet wird. Beide sind Klassen des Quickfix-Pakets, das ich von einem externen jar (nicht meinem Code) bekomme. Ich soll es nicht ändern (und nicht ändern). – theDima

+0

Ja, aber Sie haben das Nicht-Argument-Konstruktorfehler mit diesem 'JavaSerializer' behoben und jetzt macht das Problem dasselbe im Deserialisierungsschritt. Gibt es eine Möglichkeit, einen 'JavaDeserializer' auf dem' readObject' zu verwenden? – rupweb

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

sollten Sie haben eine nicht-arg Konstruktor für alle Klassen, die serialisiert werden. Wenn nicht Ihre Klasse und Sie können es nicht ändern, dann sollten Sie Ihren eigenen Serializer wie in this link

Verwandte Themen