자바 직렬화란?


프로젝트를 하던 중 직렬화가 필요한 순간이 많았는데 직렬화가 무엇인지,

왜 필요한지 어떤 주의사항들이 있는지 알아보고자 직접 예제를 통해 학습하고

이펙티브 자바 직렬화 부분을 참고했다.


자바 직렬화란?

자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록

바이트 형태로 (byte) 데이터를 반환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환(역직렬화)하는 기술이다.

직렬화된 객체는 다른 VM에 전송하거나 디스크에 저장한 후 나중에 역직렬화할 수 있다.


직렬화 / 역직렬화 하는 법

자바 기본(primitive) 타입과 java.io.Serializable 인터페이스를 상속받은 객체는 직렬화 할 수 있는 기본 조건을 가진다.

역직렬화는 다음과 같은 조건을 만족해야 한다.


serialVersionUID 가 자동 생성되긴 하지만 클래스의 구조 정보를 이용하여 생성되기 때문에

클래스의 구조가 달라지면 역직렬화 과정에서 예상하지 못한 InvalidClassException을 유발할 수 있음을 주의해야 한다.



serialVersionUID가 없으면?

Q. User를 직렬화 한 데이터를 저장해두고, User에 새로운 필드를 추가하고 기존에 저장해둔 데이터를 역직렬화하면 잘 될까?

name, age 필드만 있던 User 객체를 직렬화하고 email 필드를 추가한 후 역직렬화를 해봤다.

serialVersionUID를 명시한 경우와 그렇지 않은 경우 어떤 차이가 있을까?


v1

email 필드를 추가하고 역직렬화를 했지만 User 객체의 역직렬화는 잘 진행되어

email 필드는 null로 출력되었다.


v2

InvalidClassException가 발생하면서 역직렬화가 진행되지 않았다.