## 목표
직렬화 구현 시 장기적인 관점을 고려해야 하는 이유를 알아보자.
## 핵심 요약
- 직렬화된 클래스는 공개 API가 되므로 수정이 어렵기 때문에 설계 시 신중해야 한다.
- 역직렬화로 불변식이 깨질 위험이 있으며, 보안 취약점이 존재한다.
- 상속용 혹은 내부 클래스는 직렬화를 피하고, 정적 멤버 클래스만 허용하는 것이 좋다.
## Topics
SerialVersionUID 관리 - 2가지 방법
[1] 수동
- 직렬화 클래스에 개발자가 직접 명시해 주는 것이다.
- 장점
- 클래스의 내용이 변경되어도 시스템이 자동 생성하는 값으로 변경되지 않는다.
- 런타임에 SUID를 생성하는 시간을 줄일 수 있다.
[2] 자동
- 시스템이 자동으로 생성해준다.
- 장점
- 클래스 간에 중복된 값이 생기지 않게 할 수 있다.
주의해야 하는 상황
직렬화 가능 클래스에서 멤버 변수의 타입이 바뀔 때 예외가 발생할 수 있다. 하지만 그외의 경우라도 클래스가 자주 변경될 소지가 있다면 직렬화를 사용하지 않는 것이 좋다.
직렬화에서 발생하는 예외
[1] InvalidClassException
- 클래스의 SerialVersinUID 가 다른 경우
- 클래스에 다른 데이터 타입을 포함한 경우
- 기본 생성자가 없는 경우 (부모 클래스는 직렬화 구현 X, 하위 클래스는 직렬화를 구현했을 때 역직렬화하는 과정 중 발생)
[2] NotSerializableException
- Serializable을 구현하고 있찌만 다른 클래스의 객체를 참조 변수로 가지고 있거나, 그 참조하는 클래스가 직렬화를 구현하지 않았을 경우 발생한다.
- 해당 클래스도 직렬화를 구현하도록 하거나, transient 키워드를 통해 직렬화 제외 설정을 해줘야 한다.
참고
## 목표
직렬화 구현 시 장기적인 관점을 고려해야 하는 이유를 알아보자.
## 핵심 요약
## Topics
SerialVersionUID 관리 - 2가지 방법
[1] 수동
[2] 자동
직렬화에서 발생하는 예외
[1] InvalidClassException
[2] NotSerializableException
참고