2016-07-25 5 views
1

Мы пытаемся использовать сериализатор Kryo для сериализации нашего объекта приложения, чтобы протолкнуть их в поток kafka.Kryo Serializer IllegalAccessError во время выполнения

Код сериализации

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

Метод сериализации является:

@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 extends Output и емкость - это защищенная область.

ответ

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.