✔️ 직렬화와 역직렬화
직렬화란?
- 자바 시스템 내부에서 사용되는 객체 또는 데이터를
외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터를 변환하는 기술
즉, JVM의 메모리에 상주되어 있는 객체 데이터를 바이트 형태로 변환하는 기술 - 각자 PC의 OS마다 서로 다른 가상 메모리 주소 공간을 가지기 때문에 참조형 타입의 데이터들은 인스턴스를 전달할 수 없음
그러므로 이 문제를 해결하기 위해서는 주소 값이 아닌, 바이트 형태로 직렬화된 객체 데이터를 전달해야 함 - 직렬화된 데이터들은 모두 기본형 타입이 되고, 이는 파일 저장이나 네트워크 전송 시 파싱이 가능한 유의미한 데이터가 됨
- JVM에서 상주하는 객체 데이터를 영속화하거나 Sevlet Session, Cache, Java Remote Method Invocation일 때 사용
- 자바에서는 Serializable 인터페이스를 구현하여 직렬화가 가능함
- 하지만 클래스 변경을 개발자가 예측할 수 없을 때, 자주 변경되는 클래스일 때는 직렬화 사용을 지양해야 함
- 직렬화 데이터는 타입, 클래스 메타 정보를 포함하여 사이즈가 크므로
트래픽에 따라 비용 증가 문제가 발생할 수 있으므로 JSON 포맷으로 변경하는 것이 2 ~ 10배 더 효율적

@Entity
@AllArgsConstructor
@toString
public class Post implements Serializable { // 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으로 직렬화를 진행
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(post);
// 바이트로 변환된 post 객체 값
serializedPost = baos.toByteArray();
}
}
역직렬화란?
- 직렬화된 데이터를 받는 곳에서 다시 객체 데이터로 변환하기 위한 기술
즉, 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태의 기술 - 이때 자바 직렬화 대상 객체는 동일한 serialVersionUID를 가지고 있어야 하므로
직렬화에서부터 자동 해시값이 아닌, 직접 serialVersionUID를 관리해야 클래스의 변수가 변경되어도 문제가 발생하지 않게 됨 - 역직렬화에 실패하는 상황에 대한 예외처리는 필수로 구현해야 함
try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedPost)) {
// ObjectInputStream로 역직렬화를 진행
try (ObjectInputStream ois = new ObjectInputStream(bais)) {
// post 객체로 변환된 바이트 값
Object objectPost = ois.readObject();
Post post = (Post) objectPost;
}
}
'Tech Interview > Language' 카테고리의 다른 글
[Language] 동기화와 비동기화 (0) | 2024.03.27 |
---|---|
[Language] Record (0) | 2024.03.26 |
[Language] Stream (0) | 2024.03.26 |
[Language] Lambda (0) | 2024.03.26 |
[Language] 어노테이션 (0) | 2024.03.26 |
✔️ 직렬화와 역직렬화
직렬화란?
- 자바 시스템 내부에서 사용되는 객체 또는 데이터를
외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터를 변환하는 기술
즉, JVM의 메모리에 상주되어 있는 객체 데이터를 바이트 형태로 변환하는 기술 - 각자 PC의 OS마다 서로 다른 가상 메모리 주소 공간을 가지기 때문에 참조형 타입의 데이터들은 인스턴스를 전달할 수 없음
그러므로 이 문제를 해결하기 위해서는 주소 값이 아닌, 바이트 형태로 직렬화된 객체 데이터를 전달해야 함 - 직렬화된 데이터들은 모두 기본형 타입이 되고, 이는 파일 저장이나 네트워크 전송 시 파싱이 가능한 유의미한 데이터가 됨
- JVM에서 상주하는 객체 데이터를 영속화하거나 Sevlet Session, Cache, Java Remote Method Invocation일 때 사용
- 자바에서는 Serializable 인터페이스를 구현하여 직렬화가 가능함
- 하지만 클래스 변경을 개발자가 예측할 수 없을 때, 자주 변경되는 클래스일 때는 직렬화 사용을 지양해야 함
- 직렬화 데이터는 타입, 클래스 메타 정보를 포함하여 사이즈가 크므로
트래픽에 따라 비용 증가 문제가 발생할 수 있으므로 JSON 포맷으로 변경하는 것이 2 ~ 10배 더 효율적

@Entity
@AllArgsConstructor
@toString
public class Post implements Serializable { // 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으로 직렬화를 진행
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(post);
// 바이트로 변환된 post 객체 값
serializedPost = baos.toByteArray();
}
}
역직렬화란?
- 직렬화된 데이터를 받는 곳에서 다시 객체 데이터로 변환하기 위한 기술
즉, 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태의 기술 - 이때 자바 직렬화 대상 객체는 동일한 serialVersionUID를 가지고 있어야 하므로
직렬화에서부터 자동 해시값이 아닌, 직접 serialVersionUID를 관리해야 클래스의 변수가 변경되어도 문제가 발생하지 않게 됨 - 역직렬화에 실패하는 상황에 대한 예외처리는 필수로 구현해야 함
try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedPost)) {
// ObjectInputStream로 역직렬화를 진행
try (ObjectInputStream ois = new ObjectInputStream(bais)) {
// post 객체로 변환된 바이트 값
Object objectPost = ois.readObject();
Post post = (Post) objectPost;
}
}
'Tech Interview > Language' 카테고리의 다른 글
[Language] 동기화와 비동기화 (0) | 2024.03.27 |
---|---|
[Language] Record (0) | 2024.03.26 |
[Language] Stream (0) | 2024.03.26 |
[Language] Lambda (0) | 2024.03.26 |
[Language] 어노테이션 (0) | 2024.03.26 |