Serializable 인터페이스

import java.io.Serializable;

public interface Serializable {}
  • 내용이 없는 “마커 인터페이스”
  • 객체를 바이트 형태로 변환(직렬화)할 수 있게 해주는 마커 인터페이스
  • 해당 인터페이스를 구현하면, Java는 이 객체가 직렬화 가능하다고 판단
  • 객체를 `ObjectOutputStream`, `ObjectInputStream` 등을 통해 직렬화/역직렬화 가능
  • 네트워크 전송(HTTP API 호출 시), 파일에 객체 저장, 분산 시스템(메시지 큐, 세션 저장 등) 에 사용됨

 

직렬화(Serialization)

  • 객체를 저장하거나 전송할 수 있도록 byte 형태로 변환하는 과정
  • 객체의 상태(필드 값 등)를 파일로 저장하거나 네트워크를 통해 전송할 수 있게 만드는 기술

 

사용 예시

1️⃣ 클래스를 직렬화 가능하게 만들기

import java.io.Serializable;

public class UserDTO implements Serializable {
    private String name;
    private int age;

    // 생성자, getter/setter 
}

 

2️⃣ 객체를 파일로 저장 (직렬화)

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.ser"));
oos.writeObject(new UserDTO("Alice", 30));
oos.close();

 

3️⃣ 파일에서 객체 읽기 (역직렬화)

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.ser"));
UserDTO user = (UserDTO) ois.readObject();
ois.close();

 

⚠️ 주의 사항

항목  설명
serialVersionUID 직렬화 호환성 ID. 클래스 변경 시 역직렬화 오류 방지
transient 키워드 직렬화에서 제외할 필드 지정
부모 클래스도 직렬화 필요 상속 구조일 경우, 부모도 Serializable이면 더 안전함

 

🔹 serialVersionUID

private static final long serialVersionUID = 1L;
  • Serializable 인터페이스를 구현한 클래스에 선언
  • 직렬화된 객체와 현재 클래스가 동일한 버전인지 검증하는 용도
  • 클래스가 바뀌면 자동 생성되는 UID도 달라짐
  • 수동 지정하지 않으면 UID가 자동 생성됨
    • 클래스의 구조가 바뀌었을 때 UID 변경됨
    • 이전에 생성된 객체를 불러오는 데 문제가 생겨 InvalidClassException 발생 가능

 

🔹 transient 키워드

  • 직렬화하지 말아야 할 필드 앞에 붙이는 java 키워드
  • static 필드 : 클래스 자체에 속하므로 직렬화 대상 아님
• `ObjectOutputStream`을 통해 저장(직렬화)되지 않음
• `ObjectInputStream`을 통해 읽어올 때는 기본값(0,null 등)으로 초기화됨
직렬화 제한하는 이유
• 민감 정보를 저장하거나 전송하는 것을 막기 위해서
• 이미지와 같이 무거운 필드를 생략해 직렬화 속도를 향상 시키기 위해서
• Thread, Socket 과 같은 직렬화 불가능한 필드가 포함된 경우 예외를 방지하기 위해서

 

🔹 부모 클래스도 직렬화 필요

  • 객체의 전체 상태(필드 등)를 올바르게 저장하고 복원하기 위함
  • Java 객체를 직렬화하면 해당 클래스의 모든 필드 정보가 바이트 형태로 저장되는데
    • 부모 클래스의 필드도 자식 객체 안에 포함되므로, 부모가 Serializable을 구현하지 않으면 직렬화 되지 않음

'Java' 카테고리의 다른 글

VO 🆚 DTO  (0) 2025.05.02
Stream 인터페이스  (0) 2025.05.02
Predicate 인터페이스  (0) 2025.05.02
참조타입 (reference type)  (0) 2025.05.01
기본타입 (primitive type)  (0) 2025.05.01