2016-07-25 13 views
1

Kryoシリアライザを使用して、アプリケーションオブジェクトをシリアル化してカフカストリームにプッシュしようとしています。KryoシリアライザIllegalAccessError at runtime

は、シリアル化コードが

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

Serializeメソッドがありました:

@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理由出力を拡張し、容量は保護されたフィールドです。

答えて

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

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

それはIllegalAccessError用のJavaドキュメントで述べたよう

1

..私はこれが動作すると思い、これを試してみてください:

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のlibsの場合は、プロジェクトに(チェックすることです)はお互いに準拠しており、Kryoの1バージョンに属しています。

関連する問題