2016-07-25 26 views
1

我們試圖使用Kryo序列化程序來序列化我們的應用程序對象,以將它們推送到kafka流中。Kryo序列化程序在運行時發生IllegalAccessError

序列化代碼

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

Serialize方法是:

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

     ByteBufferOutput output = new ByteBufferOutput(100); 

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

在執行我們得到以下IllegalAccessError應用:

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) 

這很奇怪,因爲ByteBufferOutput擴展輸出和容量是一個受保護的領域。

回答

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

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

試試這個我認爲這會工作..

1

因爲它在Java文檔說爲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.

所以建議將檢查所有KRYO庫(在您的項目)相互兼容,屬於Kryo的單一版本。