2016-07-25 5 views
1

Wir versuchen, Kryo Serializer zu verwenden, um unser Anwendungsobjekt zu serialisieren, um sie in einen Kafka-Stream zu schieben.Kryo Serializer IllegalAccessError zur Laufzeit

Der Serialisierungscode hat

private ThreadLocal<Kryo> kryos = new ThreadLocal<Kryo>() { 
     protected Kryo initialValue() { 
      Kryo kryo = new Kryo(); 
      kryo.addDefaultSerializer(MyApp.class, new MyAppKyroSerializer()); 
      return kryo; 
     }; 
    }; 

Die serialize Methode ist:

@Override 
    public byte[] serialize(String topic, MyApp data) { 

     ByteBufferOutput output = new ByteBufferOutput(100); 

     kryos.get().writeObject(output, data); 
     return output.toBytes(); 
    } 

Während die Ausführung der Anwendung wir folgende IllegalAccessError bekommen:

Exception in thread "main" java.lang.IllegalAccessError: tried to access field com.esotericsoftware.kryo.io.Output.capacity from class com.esotericsoftware.kryo.io.ByteBufferOutput 
    at com.esotericsoftware.kryo.io.ByteBufferOutput.<init>(ByteBufferOutput.java:66) 
    at com.esotericsoftware.kryo.io.ByteBufferOutput.<init>(ByteBufferOutput.java:58) 
    at com.mycom.serializer.MyAppSerializer.serialize(MyAppSerializer.java:43) 

Das ist seltsam, weil ByteBufferOutput erweitert Ausgabe und Kapazität ist ein geschütztes Feld.

Antwort

1
public byte[] serialize(String topic, Myapp data) { 

    Output output = new Output(100); 
    kryos.get().writeObject(output, data); 
    return output.toBytes(); 
} 

dies versuche ich dies denken arbeiten ..

1

Wie gesagt, es in Java Dokumentation für IllegalAccessError:

Normally, this error is caught by the compiler; this error can only occur at run time if the definition of a class has incompatibly changed.

So würde Vorschlag, wenn alle Kryo-Libs (in Ihrem Projekt zu überprüfen sein) sind miteinander kompatibel und gehören zu einer Version von Kryo.