아이템 87. 커스텀 직렬화 형태를 고혀해보라.

이펙티브 자바

아이템 87. 커스텀 직렬화 형태를 고혀해보라.

먼저 고민해보고 괜찮다고 판단될 때만 기본 직렬화 형태를 사용하라.

객체의 물리적 표현과 논리적 내용이 같다면 기본직렬화 형태라도 무방하다.

기본 직렬화 형태가 적합하다고 결정했더라도 불변식 보장과 보안을 위해 readObject 메서드를 제공해야 할 때가 많다.

객체의 물리적 표현과 논리적 표현의 차이가 클 때 기본 직렬화 형태를 사용하면 크게 4가지 측면에서 문제가 생긴다.

  1. 공개 API가 현재의 내부 표현 방식에 영구히 묶인다.
  2. 너무 많은 공간을 차지할 수 있다.
  3. 시간이 너무 많이 걸릴 수 있다.
  4. 스택오버플로를 일으킬 수 있다.

해당 객체의 논리적 상태와 무관한 필드라고 확신할 때만 transient 한정자를 생략해야 한다.

객체 전체 상태를 읽는 메서드에 적용해야 하는 동기화 메커니즘을 직렬화에도 적용해야 한다.

1
private static final long serialVersionUID = 234098243823485285L; // 아무 값이나 상관없다.

어떠한 직렬화 형태를 택하든 직렬화 가능 클래스 모두에 serialVersionUID 를 명시적으로 부여하자.

구버전으로 직렬화된 인스턴스들과 호환성을 끊으려는것이 아니면 serialVersionUID 를 바꾸지 말자.

참조