Study/이펙티브 자바 / / 2024. 5. 28. 20:24

[Effective Java] Serializable을 구현할지는 신중히 결정하라

💥 개요

클래스의 인스턴스를 직렬화할 수 있게 하려면 클래스 선언에 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 구현은 아주 신중하게 이뤄져야 한다. 상속할 수 있는 클래스라면 주의사항이 아주 많아진다.
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유