86. Serializable을 구현할지는 신중히 결정하라

  • implements Serializable 만 붙이면 끝?

    • 진실은 아니다.

  • 문제들

    • 릴리즈 뒤 수정이 어렵다.

      • 직렬화된 바이트 스트림 인코딩도 하나의 공개 API 가 되어, 영원히 지원해야 한다

      • private, package-private 인스턴스들도 공개 API가 된다.

    • 새로운 버전에 대한 테스트 증가

      • 신버전으로 직렬화 후 구버전으로 역직렬화 가능한지 확인 필요 (그 반대도)

    • 나머지 사례 이해 안됨...

  • 역사적으로,

    • BigInteger와 Instant 같은 "값" 클래스와 컬렉션 클래스들은 Serializable 을 구현하고 스레드 풀 처럼 "동작"하는 객체를 표현하는 클래스들은 구현 안함

    • 상속용으로 설계된 클래스는 Serializable 을 구현하면 안된다.

    • Interface도 대부분 Serializable 를 확장해선 안된다.

      • 확장하려는 사람에게 큰 부담을 안겨주는것.

    • 만약 상위 클래스가 직렬화를 지원하지 않지만, 하위 클래스는 지원하려 할때

      • 이런 클래스를 역직렬화 하려면, 상위클래스는 매개변수가 없는 생성자를 제공해야 하는데, 그렇지 않으려면, 하위 클래스에서는 프록시 패턴을 이용해야한다. (item 90)

    • 내부 클래스는 직렬화를 구현하지 말자

Last updated