사용자 도구

사이트 도구


java:kryo

문서의 이전 판입니다!


Kryo - Java 직렬화(Serialization)

기본 직렬화/역직렬화

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를 너무 작게 잡으면 대용랴 데이터를 인코딩할 수 없을 수 있다. 원하는 최대 데이터 크기에 맞게 잡아줘야한다.

서로 다른 버전의 Class 지원

  • 캐시된 클래스가 달라질 경우, 역직렬화시에 오류가 발생한다.
  • CompatibleFieldSerializer 를 사용하면 오류는 발생하지 않는다.
    Kryo kryo = new Kryo();
    kryo.setDefaultSerializer(CompatibleFieldSerializer.class);
  • 하지만 서버별로 객체는 생성했으나 필드에 값이 없는 경우가 발생할 수도 있다.

Hibernate LazyInitializationException with Kryo

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() 사용할 수 있는지, 없다면 왜 안되는지 확인 필요.
java/kryo.1400479655.txt.gz · 마지막으로 수정됨: 2014/05/19 15:07 저자 kwon37xi