[CS] Serialization (직렬화) & Deserialization (역직렬화)

박상민·2023년 3월 1일
0

Computer Science

목록 보기
8/29

💡 자바 시스템 내에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에도 사용할 수 있도록 바이트(byte) 형태로 데이터를 변환하는 기술

직렬화_역직렬화

각 PC의 OS마다 서로 다른 가상 메모리 주소 공간을 가지기 떄문에, Reference type의 데이터들은 객체를 전달할 수 없다.
이런 문제를 해결하기 위해서는 주소값이 아닌 Byte 형태로 직렬화된 객체 데이터를 전달해야 한다.
직렬화된 데이터들은 모두 Primitive type이 되고, 이를 파일 저장이나 네트워크 전송 시 파싱이 가능한 유의미한 데이터가 된다.
따라서 직렬화는 자바 시스템 내에서 사용되는 객체를 전송 및 저장이 가능한 데이터로 만들어주는 과정이다.

📌 직렬화 조건

  • java.io.Serializable 인터페이스 구현으로 직렬화/역직렬화가 가능하다.
  • 직렬화 대상은 인터페이스를 상속 받은 객체, Primitive 데이터이다.
  • Primitive type이 아닌 Reference type처럼 주소값을 지닌 객체들은 바이트로 변환하기 위해 Serializable 인터페이스를 구현해야 한다.

📌 직렬화 구현

💡 serialVersionUID 란?

  • 선언하지 않아도 자동으로 해시값이 할당된다.
  • 기존 클래스 멤버 변수가 변경되면 serialVersionUID가 변경되는데, 역직렬화시 달라진 serialVersionUID로 Exception이 발생할 수 있다.
  • 직접 serialVersionUID를 관리해야 클래스 변수가 변경되어도 직렬화 / 역직렬화에 문제가 발생하지 않게 된다.
@Entity
@AllArgsConstructor
@toString
// Serializable 인터페이스를 상속받아서 구현
public class Post implements Serializable {
private static final long serialVersionUID = 1L;
    
private String title;
private String content;
Post post = new Post("제목", "내용");
byte[] serializedPost;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
	// ObjectOutputStream 으로 직렬화를 진행한다.
    // Byte로 변환된 값을 저장하면 된다.
    try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
        oos.writeObject(post);
        serializedPost = baos.toByteArray();
    }
}

📌 역직렬화 구현

try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedPost)) {
	// ObjectInputStream 으로 역직렬화를 진행한다.
    // Byte의 값을 다시 객체로 저장하는 과정이다.
    try (ObjectInputStream ois = new ObjectInputStream(bais)) {

        Object objectPost = ois.readObject();
        Post post = (Post) objectPost;
    }
}
profile
💡 클린코드를 지향하는 Backend Developer

0개의 댓글