직렬화 역직렬화는 무엇인가?

메모리에 있는 정보를 디스크에 저장하거나 네트워크 통신에 사용하기 위한 적합한 형식으로 변환하는 것을 말한다. 역직렬화는 그 반대로 디스크에 저장한 데이터를 읽거나 네트워크 통신으로 받은 데이터를 메모리에서 사용할 수 있도록 변환하는 것이다.

왜 필요한가?

일반적인 개발언어들의 데이터들의 메모리 구조는 두가지로 나뉜다.

  • 값 형식 데이터(Value Type): 우리가 흔히 선언해서 사용하는 int, float, char 등 값 형식 데이터들은 스택에 메모리가 쌓이고 직접 접근이 가능하다.
  • 참조 형식 데이터(Reference Type): C# Object 혹은 C++ 포인터 변수들이 여기에 해당된다. 해당 형식의 변수를 선언하면 힙에 메모리가 할당되고 스택에서는 이 힙 메모리를 참조하는(힙 메모리 번지 주소를 가지고 있음) 구조로 되어있다.

이 두가지 데이터 중 디스크에 저장하거나 통신에는 값 형식 데이터(Value Type)만 가능하다.

왜 값 형식만 사용 가능한가?

변수 Class A를 선언하여 객체를 만들면 힙 영역에 메모리가 할당되어 데이터가 저장되고 Class A변수는 해당 메모리영역 주소(0x00011111과 같은)를 갖게된다. 프로그램 종료 후 다시 주소값을 가져온다 하더라도 기존 데이터를 가져올 수 없게된다. 왜냐면 메모리에서 해제되어 사라졌기 때문이다.

네트워크 통신또한 각 PC마다 사용하고 있는 메모리 공간 주소는 다르기 때문에 내가 전달하는 데이터의 주소값은 무의미해진다. 데이터를 받은 메모리 주소에는 전혀 다른 값이 존재하기 때문이다.

직렬화를 거치면 주소값이 가지는 데이터들을 가져와 Value Type 데이터로 변환해준다. 이러한 이유 때문에 데이터를 저장 및 통신 전에 직렬화를 해주어야한다. 직렬화 된 데이터들은 언어에 따라서 텍스트 또는 바이너리 등 형태가 되는데 이러한 형태가 되었을때 통신하여 데이터가 오갈때 유의미한 데이터가 될 수 있다.

Java 직렬화란?

  • 자바 시스템 내부에서 사용하는 객체 또는 데이터들을 외부의 자바 시스템에서도 이용할 수 있도록 byte 형태로 데이터 변환하는 기술로 바이트로 변환된 데이터를 다시 객체로 변환하는 역직렬화를 포함한다.

Java 직렬화 코드

public class Member implements Serializable {
    private String name;
    private String email;
    private int age;
}

기본(primitive) 타입과 java.io.Serializable 인터페이스를 상속받은 객체는 직렬화 할 수 있는 기본 조건을 가진다.

참고

데이터 직렬화(serialization)는 무엇이고 왜 필요한가? (tistory.com)

Java 직렬화를 하는 이유가 무엇일까? (velog.io)