JAVA · 파일/IO
Serialization과 역직렬화
Java 직렬화의 동작 원리, 보안 위험, 대안을 알아봅니다.
파일/IO고급Serializable직렬화transientserialVersionUID
핵심 설명
Java 직렬화의 동작 원리, 보안 위험, 대안을 알아봅니다.
Java code
import java.io.*;
public class SerializationDemo {
// Serializable 구현
static class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private transient String password; // 직렬화 제외
private int age;
User(String name, String password, int age) {
this.name = name;
this.password = password;
this.age = age;
}
@Override
public String toString() {
return String.format("User{name=%s, pw=%s, age=%d}",
name, password, age);
}
}
public static void main(String[] args) throws Exception {
User user = new User("홍길동", "secret123", 30);
// 직렬화
byte[] bytes;
try (var baos = new ByteArrayOutputStream();
var oos = new ObjectOutputStream(baos)) {
oos.writeObject(user);
bytes = baos.toByteArray();
}
System.out.println("직렬화 크기: " + bytes.length + " bytes");
// 역직렬화
try (var bais = new ByteArrayInputStream(bytes);
var ois = new ObjectInputStream(bais)) {
User restored = (User) ois.readObject();
System.out.println(restored);
// password는 null (transient)
}
// 권장: JSON 직렬화 (Jackson)를 대신 사용
// ObjectMapper mapper = new ObjectMapper();
// String json = mapper.writeValueAsString(user);
}
}학습 팁
Java 직렬화보다 JSON(Jackson, Gson)이나 Protocol Buffers를 사용하세요. 직렬화는 보안 취약점의 주요 원인입니다.
주의할 점
serialVersionUID를 선언하지 않으면 클래스 변경 시 역직렬화가 실패합니다. 항상 명시적으로 선언하세요.
자주 묻는 질문
Serialization과 역직렬화란 무엇인가요?
Java 직렬화의 동작 원리, 보안 위험, 대안을 알아봅니다.
Serialization과 역직렬화 학습 시 주의할 점은 무엇인가요?
serialVersionUID 를 선언하지 않으면 클래스 변경 시 역직렬화가 실패합니다. 항상 명시적으로 선언하세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.