문서의 이전 판입니다!
asm
라이브러리 버전 충돌이 발생한다면 kryo
대신 kryo-shaded
artifact를 사용한다. 이는 asm 라이브러리를 repackaging해서 사용한다.public static final int BASE_FLAG = 0; @Override public CachedObject encode(Object o) { Kryo kryo = new Kryo(); Output output = new Output(bufferSize, maxBufferSize); kryo.writeClassAndObject(output, o); byte[] bytes = output.toBytes(); return new CachedObjectImpl(BASE_FLAG, bytes); } @Override public Object decode(CachedObject data) { Kryo kryo = new Kryo(); return kryo.readClassAndObject(new Input(data.getData())); }
encode
시에 maxBufferSize
를 너무 작게 잡으면 대용랴 데이터를 인코딩할 수 없을 수 있다. 원하는 최대 데이터 크기에 맞게 잡아줘야한다.CompatibleFieldSerializer
를 사용하면 오류는 발생하지 않는다.Kryo kryo = new Kryo(); kryo.setDefaultSerializer(CompatibleFieldSerializer.class);
org.hibernate.LazyInitializationException when de-serializing
kryoSerializer = new Kryo() { @Override public Serializer<?> getDefaultSerializer( final Class type ) { if (AbstractPersistentCollection.class.isAssignableFrom( type )) { return new FieldSerializer( kryoSerializer, type ); } return super.getDefaultSerializer( type ); } } // AbstractPersistentCollection is org.hibernate.collection.AbstractPersistentCollection. // 혹시 kryo.addDefaultSerializer() 사용할 수 있는지, 없다면 왜 안되는지 확인 필요.
Kryo 3.x 부터 Kryo Object Pool 기능이 생겨서 성능 향상에 도움이 될 수 있음.
import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.pool.*; KryoFactory factory = new KryoFactory() { public Kryo create () { Kryo kryo = new Kryo(); // configure kryo instance, customize settings return kryo; } }; // Build pool with SoftReferences enabled (optional) KryoPool pool = new KryoPool.Builder(factory).softReferences().build(); Kryo kryo = pool.borrow(); // do s.th. with kryo here, and afterwards release it pool.release(kryo); // or use a callback to work with kryo - no need to borrow/release, // that's done by `run`. String value = pool.run(new KryoCallback() { public String execute(Kryo kryo) { return kryo.readObject(input, String.class); } });
Kryo
객체 대신 kryo-serializers 의 KryoReflectionFactorySupport
를 사용하거나 - Oracle JDK만 지원