직렬화 / 역직렬화 ?

이강희·2022년 7월 31일
0

직렬화에 대해 알아보자


설명

[ 직렬화 ] : 메모리에서 디스크 형태로 데이터를 변환한다. 네트워크 통신 형태로 변경
[ 역직렬화 ] : 디스크 데이터를 읽어들이고, 네트워크 통신으로 받은 데이터를 메모리에 쓸 수 있도록 변환

왜 사용하는 것일까?

직렬화와 역직렬화를 간단하게 설명하자면 우리가 쓰는 프로그래밍 코드에서는 데이터 형식을 두가지로 나눈다.

[ 값 형식 데이터 ] : int, float, char 등 값 형식 데이터는 스택에 메모리가 쌓이고 직접 접근이 가능
[ 참조 형식 데이터 ] : 객체와 같은 참조 형식 변수를 선언하면 힙 메모리에 할당되고, 스택에서는 힙 메모리를 참조

이 때 참조 형식 데이터는 실제 값이 아닌 메모리 번지주소를 알고 있어서 만약 재부팅되면 주소가 달라져 있어서 이후에 찾을 수 없는 데이터가 된다. 최종으로 직렬화를 하게 된다면 주소로 전달되던 값을 텍스트나 바이너리 형태로 변경하여 저장하고 통신하였을 때 유의미한 데이터 교환을 할 수 있다.

데이터 직렬화 종류

종류 : CSV, XML, JSON
특징 : 사람이 읽을 수 있는 형태, 저장공간 효율성이 떨어지고 파싱하는 시간이 오래걸림, 테이터 양이 적을 때 주로 사용, 최근에는 JSON 형태로 많이 저장, 모든 시스템에서 사용 가능

종류 : Binary
특징 :사람이 읽을 수 없는 형태, 저장 공간 효율성이 높고 파싱하는 시간이 적게 걸린다. 테이터의 양이 많을 때 주로 사용, 모든 시스템에서 사용 가능

Java의 직렬화

자바 시스템 내부에서 사용되는 개체 또는 데이터를 외부 자바 시스템에서도 사용할 수 있도록 바이트 형태로 변경, JVM 메모리에 (힙, 스택) 형태로 존재하는 데이터들을 바이트 형태로 변경

Java의 역직렬화

간단하게 바이트에서 객체 형태로 변경하는 것. 직렬화된 바이트 형태의 데이터는 객체 형태로 바꾸어 JVM에 상주시킨다.

Java 직렬화와 역직렬화의 특징

  • 자바 직렬화는 자바 시스템에서 개발에 최적화 되어있다
  • 복잡한 구조의 개체라도 직렬화 기본 조건만 지키면 큰 작업 없이 바로 직렬화, 역직렬화 가능
  • 데이터 타입이 자동으로 맞춰지기 때문에 역직렬화가 되면 기존 객체처럼 사용 가능하다
  • 역직렬화를 할 때, 클래스 구조가 변경되면 문제가 발생한다.

SUID (SerialVersion UID)

  • 변경 중 데이터의 변경이 일어날 경우를 대비하여 SUID 값을 할당한다
  • Java 직렬화 대상 객체는 동일 SerialVersionUID를 가지고 있어야 하는데, SerialVersionUID를 선언하지 않으면 내부적으로 클래스의 구조 정보를 이용하여 자동으로 생성된 해시값이 할당된다 => 만약 객체 변수가 변경된다면 SerialVerisonUID도 달라진다

자바 직렬화를 언제 사용할까?

  • 짧은 만료시간을 가진 객체를 직렬화 할 때
  • 거의 변경되지 않는 데이터를 직렬화할 때
profile
도전하는 개발자 이강희입니다.

0개의 댓글