본문 바로가기

프로그래밍/libGDX

kryo - 자바 클래스 직렬화 (serialization) 라이브러리

자바 클래스 직렬화

프로그래밍을 하다 보면 특정 객체를 데이터로 바꾸고 싶을때가 있습니다. 단순히 데이터를 저장하고 싶을때나, 네트워크를 통해 객체를 전송하고자 할때 데이터로 전환할 필요가 있습니다. 이럴때 여러가지 방법이 있겠지만 보통 직렬화(serialization) 통해 객체를 바이트로 변환합니다. 자바는 기본적으로 java.io.serializable를 제공하여 객체 직렬화 기능을 제공하고 있습니다. 자바의 기본 직렬화 라이브러리도 괜찮긴 하지만 보다 좋은 성능의 라이브러리들이 있습니다. 이번에 소개할 라이브러리는 kryo라고 불리는 라이브러리입니다. kryo는 속도와 크기에서 기존 라이브러리 보다 뛰어납니다. 특히 크기를 비교했을때 월등히 차이가 납니다.

Kryo 사용하기

기본적으로 kryo를 이용하여 파일을 읽고 쓰는 과정은 다음과 같습니다.

Kryo kryo = new Kryo();

// 데이터 쓰기
Output output = new Output(new FileOutputStream("file.bin"));
SomeClass someObject = ...
kryo.writeObject(output, someObject);
output.close();

// 데이터 읽기
Input input = new Input(new FileInputStream("file.bin"));
SomeClass someObject = kryo.readObject(input, SomeClass.class);
input.close();

데이터를 파일로 바로 저장할 수도 있고, byte 배열로 전환할 수도 있습니다. 위의 예제에서는 FileStream을 이용하여 파일에 읽고 쓰는 과정을 보여주고 있습니다. readObject와 writeObject 메쏘드는 byte[] 인자도 받을 수 있습니다.

Kryo는 객체를 바로 읽고 쓸 수 있습니다. 하지만 아무런 설정도 없이 객체를 직렬화 하면 속도와 크기에서 손해를 봅니다. Kryo를 제대로 사용하려면 먼저 클래스를 등록(Registration) 해야 합니다. 클래스를 등록하는 방법은 다음과 같습니다.

Kryo kryo = new Kryo();
kryo.register(SomeClass.class);
kryo.register(AnotherClass.class);

Kryo는 상황에 맞는 serializer를 선택하여 사용할 수 있습니다. 또한 Serializer를 확장하여 커스텀 serializer를 만들 수도 있습니다.

Kryo kryo = new Kryo();
kryo.register(SomeClass.class);
kryo.register(AnotherClass.class);
public class ColorSerializer extends Serializer<Color> {
  public void write (Kryo kryo, Output output, Color object) {
    output.writeInt(object.getRGB());
  }

  public Color create (Kryo kryo, Input input, Class<Color> type) {
    return new Color(input.readInt(), true);
  }
}

그 이외에도 Kyro는 다양한 기능들을 제공하고 있습니다. 자세한 사용법은 Kryo 홈페이지를 참고하세요.