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 |