2016-07-25 3 views
1

우리는 Kryo Serializer를 사용하여 응용 프로그램 객체를 직렬화하여 카프카 스트림으로 푸시하려고합니다. 직렬화 방법은Kryo Serializer 런타임시 IllegalAccessError

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

입니다

직렬화 코드가있다 :

우리는 다음과있는 IllegalAccessError를 얻고있는 응용 프로그램을 실행하는
@Override 
    public byte[] serialize(String topic, MyApp data) { 

     ByteBufferOutput output = new ByteBufferOutput(100); 

     kryos.get().writeObject(output, data); 
     return output.toBytes(); 
    } 

동안 :

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(); 
} 

..

1

그것은 IllegalAccessError 자바 문서에서 말했듯이 :

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의 한 버전에 속합니다.