사용자 도구

사이트 도구


java:kryo

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
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://github.com/eishay/jvm-serializers/wiki|Java Serializers]]   * [[https://github.com/eishay/jvm-serializers/wiki|Java Serializers]]
   * [[https://github.com/magro/kryo-serializers|Kryo Serializers]] Kryo에서 Jodatime 을 비롯한 몇몇 객체의 직렬화를 더 추가할 수 있게 해준다.   * [[https://github.com/magro/kryo-serializers|Kryo Serializers]] Kryo에서 Jodatime 을 비롯한 몇몇 객체의 직렬화를 더 추가할 수 있게 해준다.
 +
 +===== 의존성 =====
 +  * 의존성 설정시 ''asm'' 라이브러리 버전 충돌이 발생한다면 ''kryo'' 대신 ''kryo-shaded'' artifact를 사용한다. 이는 asm 라이브러리를 repackaging해서 사용한다.
  
 ===== 기본 직렬화/역직렬화 ===== ===== 기본 직렬화/역직렬화 =====
줄 15: 줄 18:
     Kryo kryo = new Kryo();     Kryo kryo = new Kryo();
  
 +    // maxBufferSize = -1 이면 무제한(actually Integer.MAX_VALUE)
     Output output = new Output(bufferSize, maxBufferSize);     Output output = new Output(bufferSize, maxBufferSize);
     kryo.writeClassAndObject(output, o);     kryo.writeClassAndObject(output, o);
줄 53: 줄 57:
  
 // AbstractPersistentCollection is org.hibernate.collection.AbstractPersistentCollection.  // AbstractPersistentCollection is org.hibernate.collection.AbstractPersistentCollection. 
 +// 혹시 kryo.addDefaultSerializer() 사용할 수 있는지, 없다면 왜 안되는지 확인 필요.
 +</code>
  
-// 혹은 +===== Kryo Object Pool ===== 
-Kryo kryoSerializer = new Kryo(); +Kryo 3.x 부터 Kryo Object Pool 기능이 생겨서 성능 향상에 도움이 될 수 있음. 
-kryo.addDefaultSerializer(AbstractPersistentCollection.classFieldSerializer.class);+ 
 +<code java> 
 +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(inputString.class); 
 +  } 
 +});
 </code> </code>
  
 +===== 기본 생성자(No args constructor)가 없을 경우 =====
 +  * 기본 생성자가 존재하지 않을 경우에는 객체를 생성하지 못해서 오류가 발생한다. 단, private 으로라도 존재하면 괜찮다.
 +  * 순수 Kryo만 사용할 때는 objenesis의 ''StdInstantiatorStrategy''를 사용한다.<code java>
 +Kryo kryo = new Kryo();
 +
 +// 먼저 기본 생성자로 객체 생성을 시도하고,
 +// 실패시에 생성자 없이 객체 생성시도하는 설정.
 +kryo.setInstantiatorStrategy(new Kryo.DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));
 +</code>
 +    * ''Kryo.DefaultInstantiatorStrategy'' 일단, 기본 생성자로 생성시도,
 +    * 안 될 경우 ''StdInstantiatorStrategy'' 로 생성
 +  * ''Kryo'' 객체 대신 kryo-serializers 의 ''KryoReflectionFactorySupport''를 사용하는 것도 가능 - Oracle JDK만 지원<code java>
 +Kryo kryo = new KryoReflectionFactorySupport();
 +</code>
 +
 +===== Enum =====
 +Kryo 기본적으로 Enum을 ordinal로 직렬화한다. 이 경우 Enum의 순서가 변경되면 문제가 발생한다.
 +''3.0.3'' 버전 이후부터 ''EnumNameSerializer''가 추가되었다. 이를 사용하면 이름 기반 직렬화를 한다.
 +<code java>
 +kryo.addDefaultSerializer(Enum.class, EnumNameSerializer.class);
 +</code>
java/kryo.1400479086.txt.gz · 마지막으로 수정됨: 2014/05/19 14:58 저자 kwon37xi