자바의 직렬화(Serialize)

Jimin·2022년 8월 10일
0

JAVA

목록 보기
6/25

직렬화(Serialize)?

Object → byte Data

  • 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술
  • JVM(Java Virtual Machine)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술

역직렬화(Deserialize)?

byte Data → Object

  • byte로 변환된 Data를 원래대로 Object나 Data로 변환하는 기술을 역직렬화(Deserialize)라고 한다.
  • 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태

직렬화의 조건

java.io.Serializable 인터페이스를 구현하는 것이 직렬화할 수 있는 기본 조건이다.

public calss Member implements Serializable{
	...
}

Serializable 인터페이스

  • Serializable 인터페이스는 속이 비어있는 인터페이스이다.
public interface Serializable {
}

- Serializable 인터페이스가 존재하는 이유?

  • 생성한 객체를 파일로 저장할 때
  • 저장한 객체를 읽을 일이 생길 때
  • 다른 서버에서 생성한 객체를 받을 일도 생길 때

Serializable 인터페이스를 구현하면 JVM에서 해당 객체는 저장하거나 다른 서버로 전송할 수 있도록 해준다.


직렬화 방법

java.io.ObjectOutputStream을 사용하여 직렬화를 진행한다.

public void save() throws Exception {
    try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename))) {
      out.writeInt(list.size());
      for (Board board : list) {
        out.writeObject(board);
      }
    }
  }

역직렬화 조건

  • 직렬화 대상이 된 객체의 클래스가 클래스 패스에 존재해야하며 import 되어 있어야 한다.
  • 중요한 점은 직렬화와 역직렬화를 진행하는 시스템이 서로 다를 수 있다는 것을 반드시 고려해야 한다.
  • 자바 직렬화 대상 객체는 동일한 serialVersionUID를 가지고 있어야 한다.

serialVersionUID

  • 모델 버전간의 호환성을 유지하기 위해 정의한다.
  • 해당 객체의 버전을 명시하는데 사용한다.
  • 인스턴스를 저장하고 읽을 때 클래스의 변화 여부를 검증하기 위해 버전 번호를 지정한다.
  • 처음 버전 번호를 부여한 후 클래스에 필드를 추가하거나 삭제할 때 마다 버전 번호를 증가시킨다.
  • 아무 값이나 넣어주어도 된다.
private static final long serialVersionUID = 1L;

역직렬화 방법

java.io.ObjectInputStream을 사용하여 역직렬화를 진행한다.

public void load() throws Exception {
    try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename))) {
      int size = in.readInt();
      for (int i = 0; i < size; i++) {
        Board board = (Board) in.readObject();
        list.add(board);
        boardNo = board.no;
      }
    }
  }

자바의 직렬화는 왜 사용하는가?

  • 복잡한 데이터 구조의 클래스의 객체라도 직렬화 기본 조건만 지키면, 큰 작업 없이 바로 직렬화, 역직렬화가 가능하다.
  • 데이터 타입이 자동으로 맞춰지기 때문에 관련 부분에 크게 신경쓰지 않아도 된다.

어디에 사용되는가?

서블릿 세션(Servlet Session)

  • 세션을 서블릿 메모리 위에서 운용한다면, 직렬화를 필요로 하지 않지만, 파일로 저장하거나 세션 클러스터링, DB를 저장하는 옵션 등을 선택하게 되면 세션 자체가 직렬화가 되어 저장되어 전달된다.

캐시(Cache)

  • Ehache, Redis, Memached 라이브러리 시스템을 많이 사용한다.

자바 RMI(Remote Method Invocation)

  • 원격 시스템 간의 메시지 교환을 위해서 사용하는 자바에서 지원하는 기술

자바 직렬화의 단점?

  • 역직렬화시 클래스 구조 변경 문제

Serialize와 Deserialize

Serialize

  • Serialize(직렬화)
    • 인스턴스 → 바이트 배열로 변환
    • marshaling
    • 직렬화 후 파일 내부에 포함된 데이터들
      • 클래스 정보(이름, 패키지명...)
      • 버전 번호(serialVersionUID)
      • 필드 값
    ⇒ 직접 필드값을 출력하는 것보다 파일 크기가 더 커지는 단점이 있지만, 코딩이 쉬워진다.

Deserialize

  • Deserialize(역직렬화)
    • 바이트 배열에 있는 data → 인스턴스 생성
    • unmashaling
    • 파일 내부에 포함된 데이터들
      • 클래스 정보(이름, 패키지명...)
      • 버전 번호(serialVersionUID)
      • 필드 값
profile
https://github.com/Dingadung

0개의 댓글