Item 86 : Serializable을 구현할지는 신중히 결정하라
2021. 9. 23. 22:55
- 직렬화의 적용은 implements Serializable만 붙이면 될 정도로 간단하지만 진실은 훨씬 더 복잡하다.
Serializable을 구현하면 릴리스한 뒤에는 수정하기 어렵다.
- 클래스가 Serializable을 구현하면 직렬화된 바이트 스트림 인코딩도 하나의 공개 API가 된다.
- 그래서 이 클래스가 널리 퍼진다면 그 직렬화 형태도 영원히 지원해야 하는 것이다.
- 커스텀 직렬화 형태를 설계하지 않고 자바의 기본 방식을 사용하면 직렬화 형태는 최소 적용당시 클래스의 내부 구현 방식에 영원히 묶여버린다.
- 직렬화 가능 클래스를 만들고자 한다면, 길게 보고 감당할 수 있을 만큼 고품질의 직렬화 형태도 주의해서 함께 설계해야 한다.
버그와 보안 구멍이 생길 위험이 높아진다.
- 직렬화는 언어의 기본 메커니즘을 우회하는 객체 생성 방식이다.
- 객체는 생성자를 사용해 만드는게 기본이다.
- 기본 방식을 따르든 재정의해 사용하든 역직렬화는 일반 생성자의 문제가 그대로 적용되는 숨은 생성자이다.
- 기본 역직렬화를 사용하면 불변식 깨짐과 허가되지 않은 접근에 쉽게 노출된다.
해당 클래스의 신버전을 릴리스할 때 테스트할 것이 늘어난다.
- 직렬화 가능 클래스가 수정되면 직렬화/역직렬화가 문제 없이 진행되는지 검사해야한다.
상속용으로 설계된 클래스는 대부분 Serializable을 구현하면 안 되며, 인터페이스 대부분 Serializable을 확장해서는 안된다.
- 클래스 확장시에 부담이 커진다.
내부 클래스는 직렬화를 구현하지 말아야 한다.
- 내부 클래스에는 바깥 인스턴스의 참조와 유효 범위 안의 지역변수 값들을 저장하기 위해 컴파일러가 생성한 필드들이 자동으로 추가된다.
'책 > 이펙티브자바' 카테고리의 다른 글
Item 88 : readObject 메소드는 방어적으로 작성하라 (0) | 2021.09.25 |
---|---|
Item 87 : 커스텀 직렬화 형태를 고려해보라 (0) | 2021.09.24 |
Item 85 : 자바 직렬화의 대안을 찾으라 (0) | 2021.09.22 |
Item 84 : 프로그램의 동작을 스레드 스케줄러에 기대지 말라 (0) | 2021.09.21 |
Item 83 : 지연 초기화는 신중히 사용하라 (0) | 2021.09.20 |