Object
또는 Data
를 다른 컴퓨터의 자바 시스템에서도 사용할 수 있도록 바이트 스트림으로 변환하는 과정을 말한다.Object
또는 Data
로 변환하는 기술이다.바이트 스트림이란?
스트림은 클라이언트나 서버 간의 출발지 목적지로 입출력하기 위한 데이터가 흐르는 통로를 말한다. 자바는 스트림의 기본 단위를 바이트로 하기 때문에, 데이터베이스로 전송하기 위해 최소 단위인 바이트 스트림으로 변환하여 처리한다.
java.io.Serializable
을 구현하면 된다. (마커 인터페이스)ObjectOutputStream
을 사용한다..ser
, .obj
로 직렬화된 데이터임을 명시하는게 좋다.ObjectInputStream
을 사용한다.transient
을 사용한다.class User implements Serializable {
private String username;
private transient String password; // 직렬화 제외
public User(String username, String password) {
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "User{username='" + username + "', password='" + password + "'}";
}
}
readObject()
, writeObject()
을 직렬화하고자 하는 클래스 내에서 오버라이딩해서 비밀번호를 제외하고 직렬화하게 할 수도 있다. // 커스텀 직렬화: password 제외
@Override
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject(); // password 제외하고 username만 직렬화
}
// 커스텀 역직렬화: password 수동 초기화
@Override
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
ois.defaultReadObject();
this.password = null; // 복원 안 됨 (직렬화 안 했으므로)
}
InvalidClassException
이 발생할 수 있다. 부모 클래스가 직렬화 불가능하다면 역직렬화하는 과정에서 JVM은 부모 클래스의 인스턴스 필드를 복원하려고 기본 생성자를 호출해 초기화하기 때문이다.Serializable
인터페이스를 구현하는 모든 직렬화된 클래스는 serialVersionUID
(이하 SUID) 이라는고유 식별번호를 부여 받는다.class Member implements Serializable {
// serialVersionUID 꼭 명시 할 것
private static final long serialVersionUID = 123L;
private String name;
private int age;
private String address;
// private String email; // 새로 추가한 클래스 구성 요소
...
}
int age
-> long age
)transient
처리를 해야 한다.