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