문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
java:kryo [2014/05/19 14:58] kwon37xi |
java:kryo [2016/01/08 20:20] (현재) kwon37xi [기본 생성자(No args constructor)가 없을 경우] |
||
---|---|---|---|
줄 1: | 줄 1: | ||
====== Kryo - Java 직렬화(Serialization) ====== | ====== Kryo - Java 직렬화(Serialization) ====== | ||
- | * http://code.google.com/p/kryo/ | + | * https://github.com/EsotericSoftware/kryo |
* Java 객체 직렬화 솔루션. | * Java 객체 직렬화 솔루션. | ||
* Java Serialization의 단점인 서로 다른 버전의 직렬화를 더 잘 지원하는듯. | * Java Serialization의 단점인 서로 다른 버전의 직렬화를 더 잘 지원하는듯. | ||
줄 6: | 줄 6: | ||
* [[https:// | * [[https:// | ||
* [[https:// | * [[https:// | ||
+ | |||
+ | ===== 의존성 ===== | ||
+ | * 의존성 설정시 '' | ||
===== 기본 직렬화/ | ===== 기본 직렬화/ | ||
줄 15: | 줄 18: | ||
Kryo kryo = new Kryo(); | Kryo kryo = new Kryo(); | ||
+ | // maxBufferSize = -1 이면 무제한(actually Integer.MAX_VALUE) | ||
Output output = new Output(bufferSize, | Output output = new Output(bufferSize, | ||
kryo.writeClassAndObject(output, | kryo.writeClassAndObject(output, | ||
줄 53: | 줄 57: | ||
// AbstractPersistentCollection is org.hibernate.collection.AbstractPersistentCollection. | // AbstractPersistentCollection is org.hibernate.collection.AbstractPersistentCollection. | ||
+ | // 혹시 kryo.addDefaultSerializer() 사용할 수 있는지, 없다면 왜 안되는지 확인 필요. | ||
+ | </ | ||
- | // 혹은 | + | ===== Kryo Object Pool ===== |
- | Kryo kryoSerializer | + | Kryo 3.x 부터 Kryo Object Pool 기능이 생겨서 성능 향상에 도움이 될 수 있음. |
- | kryo.addDefaultSerializer(AbstractPersistentCollection.class, FieldSerializer.class); | + | |
+ | <code java> | ||
+ | import com.esotericsoftware.kryo.Kryo; | ||
+ | import com.esotericsoftware.kryo.pool.*; | ||
+ | |||
+ | KryoFactory factory = new KryoFactory() { | ||
+ | public Kryo create () { | ||
+ | Kryo kryo = new 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/ | ||
+ | // that's done by `run`. | ||
+ | String value = pool.run(new KryoCallback() { | ||
+ | public String execute(Kryo kryo) { | ||
+ | return kryo.readObject(input, String.class); | ||
+ | } | ||
+ | }); | ||
</ | </ | ||
+ | ===== 기본 생성자(No args constructor)가 없을 경우 ===== | ||
+ | * 기본 생성자가 존재하지 않을 경우에는 객체를 생성하지 못해서 오류가 발생한다. 단, private 으로라도 존재하면 괜찮다. | ||
+ | * 순수 Kryo만 사용할 때는 objenesis의 '' | ||
+ | Kryo kryo = new Kryo(); | ||
+ | |||
+ | // 먼저 기본 생성자로 객체 생성을 시도하고, | ||
+ | // 실패시에 생성자 없이 객체 생성시도하는 설정. | ||
+ | kryo.setInstantiatorStrategy(new Kryo.DefaultInstantiatorStrategy(new StdInstantiatorStrategy())); | ||
+ | </ | ||
+ | * '' | ||
+ | * 안 될 경우 '' | ||
+ | * '' | ||
+ | Kryo kryo = new KryoReflectionFactorySupport(); | ||
+ | </ | ||
+ | |||
+ | ===== Enum ===== | ||
+ | Kryo 기본적으로 Enum을 ordinal로 직렬화한다. 이 경우 Enum의 순서가 변경되면 문제가 발생한다. | ||
+ | '' | ||
+ | <code java> | ||
+ | kryo.addDefaultSerializer(Enum.class, | ||
+ | </ |