【问题标题】:Kryo Serializer IllegalAccessError at runtimeKryo Serializer IllegalAccessError 在运行时
【发布时间】:2016-07-25 13:40:32
【问题描述】:

我们正在尝试使用 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 扩展了 Output 并且容量是一个受保护的字段。

【问题讨论】:

    标签: java kryo


    【解决方案1】:
    public byte[] serialize(String topic, Myapp data) {
    
        Output output = new Output(100);
        kryos.get().writeObject(output, data);
        return output.toBytes();
    }
    

    试试这个,我认为这会奏效..

    【讨论】:

      【解决方案2】:

      正如 IllegalAccessError 的 Java 文档中所说:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-31
        • 1970-01-01
        • 2017-11-21
        • 1970-01-01
        • 2021-01-20
        • 1970-01-01
        • 2019-02-19
        • 1970-01-01
        相关资源
        最近更新 更多