본문 바로가기

Language/Java

JAVA에서의 객체 직렬화 비교 (Byte Stream 직렬화 vs JSON 직렬화)

0. 알아볼 내용

Java의 객체 직렬화에는 두 가지 종류가 있다.
첫 번째로, Serializable 인터페이스를 구현한 클래스의 객체를 Byte Stream 직렬화하는 것 이다.
두 번째로, RESTful API Sever를 구현할 때, 데이터 교환을 위해 객체를 JSON 직렬화하는 것 이다.

두 가지의 차이점은 어렴풋이 알지만, 제대로 구분하여 기억하지 않았더니, 두 방법의 구현 방식과 활용법이 서로 뒤죽박죽 섞여 있었다. 이를 해결하기 위해 두 가지 형태의 직렬화에 대해 정확히 알아보고, 그 차이점을 구분하려 한다.

여기서는 먼저 두 직렬화의 의미만 간략히 알아보고 차이점 설명에 더 집중하겠다.
만약 더 자세히 알고 싶은 분은 각 항목 별 더 알아보기링크를 통해 확인하기 바란다.

다음과 같은 클래스의 객체를 두 가지 형태로 직렬화 한다고 해보자.

class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

1. Byte Stream 직렬화

Java의 특정 객체를 Byte Stream 직렬화 한다.의 의미는 객체의 상태를 이진 데이터 형식인 Byte Stream 형태로 변환한다는 의미이다. 만약 위의 클래스의 객체를 Byte Stream으로 직렬화한 뒤, 해당 파일을 열어보면 다음과 같은 형태로 보일 것이다.

aced 0005 7372 0011 5365 7269 616c 697a 6554 6573 7400 0124...

이렇게 변환된 객체는 파일 형태로 저장되거나 네트워크를 통해 전송되기도 한다.
여기서 유의해야할 부분이 있다.

  1. Byte Stream 형태로 객체를 직렬화하고 싶다면 해당 객체의 클래스가 Serializable이란 마커 인터페이스를 구현해야 한다.
  2. 개념 설명에서 말했듯이 객체의 상태만 변환한다. 즉 멤버 변수와 그 값만 저장하고, 객체의 기능을 담당하는 매소드나, 클래스의 상태를 설명하는 정적 필드는 변환되지 않는다.

더 자세한 사항은 더 알아보기에 더 자세히 적어두도록 하겠다.

2. JSON 직렬화

Java의 특정 객체를 JSON 직렬화 한다.의 의미는 객체를 텍스트 기반 <key,value> 형태로 변환한다는 것이다.
JSON 이란 Javascript object notation의 약자로 java script 객체 문법 형태로 구조화된 데이터 교환의 한 양식이다. 위 클래스의 객체를 JSON 직렬화한다면 다음과 같은 형태일 것이다.

{
    "name"    :     "전수민",
    "age"    :     30
}

이런 유형의 데이터 양식은 우리가 개발 하면서 많이 마주쳐왔다. 해당 포멧은 언어나 플랫폼 독립적인 양식으로, 어떤 언어 기반의 프레임워크에서도 호환이 되기 때문에 개발 시 자주 사용한다.

더 자세한 사항은 더 알아보기에서 더 자세히 적어두었다.

3. 둘의 차이점

구분 Byte Stream 직렬화 JSON 직렬화
개념 Java 객체의 상태를 이진 데이터로 변환 Java 객체의 상태를 JSON 형식(key-value)으로 변환
목적 객체의 정보 보존
게임 데이터 세이브, 복원을 위한 캐싱에 사용
데이터 교환
다른 언어 기반의 서버, 클라이언트와도 소통하고 데이터를 교환하기 위해 사용
가독성 이진 데이터 형태라 내용 파악이 안됨 텍스트 기반의 <key, value>형태라 내용 파악 가능
언어 종속성 종속적
Java 객체를 그대로 직렬화한 것이기 때문에, 다른 프로그래밍 언어에서 해당 데이터를 파싱하여 사용할 수 없음.
독립적
범 언어적으로 약속된 양식이라 대다수의 프레임워크에서 파싱하여 활용할 수 있음.
성능 이진 포멧이라 JSON 보다 직렬화 작업이 빠르고, 데이터 용량이 작음 텍스트 기반의 포멧이라 ByteStream에 비해 직렬화 작업이 느리고 데이터 용량이 큼