运行时Kryo Serializer IllegalAccessError

时间:2016-07-25 13:40:33

标签: java kryo

我们正在尝试使用Kryo Serializer来序列化我们的应用程序对象,以便将它们推送到kafka流中。

序列化代码

   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扩展了输出,容量是受保护的字段。

2 个答案:

答案 0 :(得分:1)

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

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

尝试这个我觉得这会有用..

答案 1 :(得分:1)

正如它在Java文档中对IllegalAccessError所说的那样:

  

通常,编译器会捕获此错误;如果类的定义发生不兼容的更改,则此错误只能在运行时发生。

所以建议检查所有Kryo库(在你的项目中)是否相互兼容并属于Kryo的一个版本。