💥 개요
클래스의 인스턴스를 직렬화할 수 있게 하려면 클래스 선언에 implements Serializable만 붙이면 된다.
쉽게 적용이 가능하지만 훨씬 복잡하고 값비싼 일이다.
⚠️ Serializable의 단점
- 릴리스 후 수정하기 어렵다.(공개 API가 됨)
- 커스텀 직렬화 형태를 설계하지 않고 기본 방식을 사용하면 클래스 내부 구현 방식에 종속된다.
- 캡슐화가 깨진다.(기본 방식의 경우 클래스 private, package-private 필드도 API로 공개한다.)
- 버그와 보안 구멍이 생길 위험이 높아진다.
- 신버전 릴리스할 때 테스트할 것이 늘어난다.
💡 Serializable 구현 주의사항
- 기본 방식보다 길게 보고 감당할 수 있을 만큼 주의해 잘 설계해야한다.
- 직렬화 가능 클래스가 수정되면 신버전 인스턴스를 직렬화 후 구버전으로 역직렬화 가능한지, 반대도 가능한지 테스트해야 한다.
- 상속용으로 설계 된 클래스는 대부분 Serializable을 구현하면 안된다.
- 인터페이스도 대부분 Serializable을 확장해서는 안된다.
- 인스턴스 필드 값 중 불변식을 보장해야 할 게 있다면 반드시 하위 클래스에서 finalize 메서드를 재정의하지 못하게 해야 한다.
- 인스턴스 필드 중 기본값으로 초기화되면 위배되는 불변식이 있다면 아래에 readObjectNoData 메서드를 반드시 추가해야 한다.
//상태가 있고, 확장 가능하고, 직렬화 가능한 클래스용 readObjectNoData 메서드
private void readObjectNoData() throw InvalidObjectException {
throw new InvalidObjectException("스트림 데이터가 필요합니다.");
}
자바 4에 추가됨
기존 직렬화 가능 클래스에 직렬화 가능 상위 클래스를 추가하는 드문 경우를 위한 메서드
- 내부 클래스는 직렬화를 구현하지 말아야 한다.
Serializable은 구현한다고 선언하기는 아주 쉽지만, 그것은 눈속임일 뿐이다. 한 클래스의 여러 버전이 상호작용할 일이 없고 서버가 신뢰할 수 없는 데이터 노출될 가능성이 없는 등, 보호된 환경에서만 쓰일 클래스가 아니라면 Serializable 구현은 아주 신중하게 이뤄져야 한다. 상속할 수 있는 클래스라면 주의사항이 아주 많아진다.
'Study > 이펙티브 자바' 카테고리의 다른 글
[Effective Java] 스레드 안전성 수준을 문서화하라 (0) | 2024.05.20 |
---|---|
[Effective Java] 과도한 동기화는 피하라 (0) | 2024.05.13 |
[Effective Java] 메서드가 던지는 모든 예외를 문서화하라 (0) | 2024.05.08 |
[Effective Java] 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라 (1) | 2024.05.07 |