프로젝트를 하던 중 직렬화가 필요한 순간이 많았는데 직렬화가 무엇인지,
왜 필요한지 어떤 주의사항들이 있는지 알아보고자 직접 예제를 통해 학습하고
이펙티브 자바 직렬화 부분을 참고했다.
자바 직렬화란?
자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록
바이트 형태로 (byte) 데이터를 반환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환(역직렬화)하는 기술이다.
직렬화된 객체는 다른 VM에 전송하거나 디스크에 저장한 후 나중에 역직렬화할 수 있다.
직렬화 / 역직렬화 하는 법
자바 기본(primitive) 타입과 java.io.Serializable
인터페이스를 상속받은 객체는 직렬화 할 수 있는 기본 조건을 가진다.
역직렬화는 다음과 같은 조건을 만족해야 한다.
- 직렬화 대상이 된 객체의 클래스가 클래스 패스에 존재해야 하며
import
되어 있어야 한다. - 자바 직렬화 대상 객체는 동일한
serialVersionUID
를 가지고 있어야 한다.
serialVersionUID
가 자동 생성되긴 하지만 클래스의 구조 정보를 이용하여 생성되기 때문에클래스의 구조가 달라지면 역직렬화 과정에서 예상하지 못한
InvalidClassException
을 유발할 수 있음을 주의해야 한다.
serialVersionUID가 없으면?
Q. User를 직렬화 한 데이터를 저장해두고, User에 새로운 필드를 추가하고 기존에 저장해둔 데이터를 역직렬화하면 잘 될까?
name, age 필드만 있던 User 객체를 직렬화하고 email 필드를 추가한 후 역직렬화를 해봤다.
serialVersionUID를 명시한 경우와 그렇지 않은 경우 어떤 차이가 있을까?
- serialVersionUID를 명시한 경우
email 필드를 추가하고 역직렬화를 했지만 User 객체의 역직렬화는 잘 진행되어
email 필드는 null로 출력되었다.
- serialVersionUID를 명시하지 않은 경우
InvalidClassException
가 발생하면서 역직렬화가 진행되지 않았다.
-
테스트 코드: https://github.com/hyerin6/TIL/tree/main/Mentoring/SerializationQuiz
-
직렬화 주의사항: https://hyerin6.github.io/2021-09-13/serialize(2)/