java - Kryo Serializer 运行时出现 IllegalAccessError

标签 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 扩展了 Output 并且容量是一个 protected 字段。

最佳答案

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

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

试试这个,我认为这会起作用..

关于java - Kryo Serializer 运行时出现 IllegalAccessError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38569348/

相关文章:

Java readInt 方法返回 Scala 中 Int 的 LittleEndian 而不是 BigEndian 值

java - TinkerPop Gremlin How to serialize Predicate passed in Until 步骤

java - 在 Kryonet 中增加服务器/客户端的缓冲区大小

java - bundle jre 中缺少 "ext"文件夹

java - 延迟集合初始化后 Hibernate 连接不会释放

java - hibernate中子对象列表的条件查询

java - Flink 1.4 AvroUtils 报错

java - 高性能

java - Swing 应用程序通过 JNA 调用 GetOpenFileName 失败

java - 如何使用 Kryo 将非常大的 Java 对象保存到 Oracle 中的 Blob 中并避免 KryoException 缓冲区溢出?