public class Member implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String email;
private String phone;
// 생략
}
serialVersionUID를 설정해준다.
Member member = new Member("홍길동", "hong@email.com","01012345678");
byte[] serializedMember;
try(ByteArrayOutputStream baos = new ByteArrayOutputStream()){
try(ObjectOutputStream oos = new ObjectOutputStream(baos)){
oos.writeObject(member);
serializedMember = baos.toByteArray();
}
}
ObjectOutputStream으로 직렬화를 진행한다. Byte로 변환된 값을 저장하면 된다.
try(ByteArrayInputStream bais = new ByteArrayInputStream(serializedMember)){
try(ObjectInputStream ois = new ObjectInputStream(bais)){
Object objectMember = ois.readObject();
Member member = (Member) objectMember;
}
}
ObjectInputStream으로 역직렬화 진행한다. Byte의 값을 다시 객체로 저장하면 된다.
public class Member implements Serializable {
//SUID 선언해주지 않으면 Member에 변화가 생길 시 예외 발생
private static final long serialVersionUID = 1L;
private String name;
private String email;
private String phone;
// 생략
}
: SUID(serialVersionUID)는 필수 값은 아니며, 선언되어 있지 않으면 클래스의 기본 해쉬값을 사용한다.
직렬화 과정에서 SUID의 버전이 포함되게 되고, 역직렬화 과정에서 java class에 선언되어 있는 SUID의 버전과 서로 동일한지 체크하게 된다.
=> SUID 계산은 클래스 세부 사항에 매우 민감하므로 예기치 않은 결과를 초래할 수 있어 SUID 값을 명시적으로 선언하는 것이 좋다.
즉, SUID 버전이 바뀌었다 == 객체의 상태가 조금이라도 바뀌었다 ==> 역직렬화 과정에서 오류 발생
public class Member implements Serializable {
//SUID 선언해주지 않으면 Member에 변화가 생길 시 예외 발생
private static final long serialVersionUID = 1L;
private String name;
private String email;
//String -> StringBuilder로 변경
private StringBuilder phone;
// 생략
}
∴ 자바 직렬화 사용할 때 클래스 구조 변경 시 어떤 부분을 확인해야 할까?
Servlet Session(서블릿 세션)
: 서블릿 기반의 WAS(톰캣, 웹로직 등) 대부분 세션의 자바 직렬화를 지원한다.
서블릿 메모리 위에서 운용한다면 직렬화가 필요없지만, 파일로 저장하거나 세션 클러스터링, DB를 저장하는 옵션 등을 선택하게 된다면 세션 자체가 직렬화되어 저장되어 전달된다.
Cache(캐시)
: 메모리, 외부 저장소, 파일 등의 저장소를 이용해서 데이터 객체를 저장한 후 동일한 요청이 오면 저장된 객체를 찾아서 응답하는 캐시 방식은 캐시할 부분을 자바 직렬화된 데이터로 저장해서 사용된다.
RMI(Remote Method Invocation)
: 원격 시스템간의 메시지 교환을 위해서 사용하는 자바에서 지원하는 기술.
원격 시스템의 메서드를 호출 시에 전달하는 메시지(객체)를 자동으로 직렬화시켜 사용된다.
[참고자료]
https://devlog-wjdrbs96.tistory.com/268
https://techblog.woowahan.com/2551/