我们正在尝试使用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扩展了输出,容量是受保护的字段。
答案 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的一个版本。