직렬화(Serialize)?
Object → byte Data
- 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술
- JVM(Java Virtual Machine)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술
역직렬화(Deserialize)?
byte Data → Object
- byte로 변환된 Data를 원래대로 Object나 Data로 변환하는 기술을 역직렬화(Deserialize)라고 한다.
- 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태
직렬화의 조건
java.io.Serializable 인터페이스를 구현하는 것이 직렬화할 수 있는 기본 조건이다.
public calss Member implements Serializable{
...
}
Serializable 인터페이스
- Serializable 인터페이스는 속이 비어있는 인터페이스이다.
public interface Serializable {
}
- Serializable 인터페이스가 존재하는 이유?
- 생성한 객체를 파일로 저장할 때
- 저장한 객체를 읽을 일이 생길 때
- 다른 서버에서 생성한 객체를 받을 일도 생길 때
Serializable 인터페이스를 구현하면 JVM에서 해당 객체는 저장하거나 다른 서버로 전송할 수 있도록 해준다.
직렬화 방법
java.io.ObjectOutputStream을 사용하여 직렬화를 진행한다.
public void save() throws Exception {
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename))) {
out.writeInt(list.size());
for (Board board : list) {
out.writeObject(board);
}
}
}
역직렬화 조건
- 직렬화 대상이 된 객체의 클래스가 클래스 패스에 존재해야하며 import 되어 있어야 한다.
- 중요한 점은 직렬화와 역직렬화를 진행하는 시스템이 서로 다를 수 있다는 것을 반드시 고려해야 한다.
- 자바 직렬화 대상 객체는 동일한 serialVersionUID를 가지고 있어야 한다.
serialVersionUID
- 모델 버전간의 호환성을 유지하기 위해 정의한다.
- 해당 객체의 버전을 명시하는데 사용한다.
- 인스턴스를 저장하고 읽을 때 클래스의 변화 여부를 검증하기 위해 버전 번호를 지정한다.
- 처음 버전 번호를 부여한 후 클래스에 필드를 추가하거나 삭제할 때 마다 버전 번호를 증가시킨다.
- 아무 값이나 넣어주어도 된다.
private static final long serialVersionUID = 1L;
역직렬화 방법
java.io.ObjectInputStream을 사용하여 역직렬화를 진행한다.
public void load() throws Exception {
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename))) {
int size = in.readInt();
for (int i = 0; i < size; i++) {
Board board = (Board) in.readObject();
list.add(board);
boardNo = board.no;
}
}
}
자바의 직렬화는 왜 사용하는가?
- 복잡한 데이터 구조의 클래스의 객체라도 직렬화 기본 조건만 지키면, 큰 작업 없이 바로 직렬화, 역직렬화가 가능하다.
- 데이터 타입이 자동으로 맞춰지기 때문에 관련 부분에 크게 신경쓰지 않아도 된다.
어디에 사용되는가?
서블릿 세션(Servlet Session)
- 세션을 서블릿 메모리 위에서 운용한다면, 직렬화를 필요로 하지 않지만, 파일로 저장하거나 세션 클러스터링, DB를 저장하는 옵션 등을 선택하게 되면 세션 자체가 직렬화가 되어 저장되어 전달된다.
캐시(Cache)
- Ehache, Redis, Memached 라이브러리 시스템을 많이 사용한다.
자바 RMI(Remote Method Invocation)
- 원격 시스템 간의 메시지 교환을 위해서 사용하는 자바에서 지원하는 기술
자바 직렬화의 단점?
Serialize와 Deserialize
Serialize
- Serialize(직렬화)
- 인스턴스 → 바이트 배열로 변환
- marshaling
- 직렬화 후 파일 내부에 포함된 데이터들
- 클래스 정보(이름, 패키지명...)
- 버전 번호(serialVersionUID)
- 필드 값
⇒ 직접 필드값을 출력하는 것보다 파일 크기가 더 커지는 단점이 있지만, 코딩이 쉬워진다.
Deserialize
- Deserialize(역직렬화)
- 바이트 배열에 있는 data → 인스턴스 생성
- unmashaling
- 파일 내부에 포함된 데이터들
- 클래스 정보(이름, 패키지명...)
- 버전 번호(serialVersionUID)
- 필드 값