12장 : 직렬화

2023. 4. 22. 18:27스터디/이펙티브 자바 스터디

728x90

아이템 85. 자바 직렬화의 대안을 찾으라 

- 아주 신중하게 제작한 바이트 스트림만 역직렬화 해야- 직렬화 위험을 회피하는 가장 좋은 방법은 아무것도 역직렬화 하지 않는 것- 새로운 시스템에서 자바 직렬화를 써야하는 경우는 전혀 없음- 신뢰할 수 없는 데이터는 절대 역직렬화 하지 않아야- 직렬화를 피할 수 없고 역직렬화한 데이터가 안전한 지 완전히 확신할 수 없다면 객체 역직렬화 필터링을 사용

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

- Serizalizable을 구현하면 릴리스한 뒤에는 수정하기 어려움

- private 인스턴스 마저 api로 공개되는 꼴(캡슐화가 깨짐)

- 버그와 보안 구명이 생길 수 있음

- 역직렬화는 숨은 생성자임

- 기본 역직렬화를 사용하면 불변식 꺠짐과 허가되지 않은 접근에 쉽게 노출됨

- 상속용으로 설계된 클래스는 대부분 Serializable을 구현하면 안 되며, 인터페이스도 대부분 Serializable을 확장해서는 안 됨

- 내부 클래스는 직렬화를 구현하면 안 됨


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

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

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

- 객체 물리적 표현과 논리적 표현 차이가 생길 때 문제

1. 공개 API가 현재 내부 표현 방식에 영구히 묶임

2. 너무 많은 공간을 차지할 수 있음

3. 시간이 너무 많이 걸림

4. 스택 오버플로 일으킴

- 해시 테이블에 기본 직렬화를 사용하면 심각한 버그가 일어남

- transient로 선언해도 된느 인스턴스 필드에는 모두 transient 붙여야

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

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

- 직렬화 가능 클래스 모두에 직렬 버전 UID를 명시적으로 부여


아이템 88. readObject 메서드는 방어적으로 작성하라 

- 객체를 역질렬화할 때는 클라이언트가 소유해서는 안 되는 객체 참조를 갖는 필드를 모두 반드시 방어적으로 복사해야

- final 필드는 방어적 복사가 불가능

- 직렬화 가능 클래스라면 readObject를 호출해서는 안 됨 

- readObject를 작성할 땐 Public 생성자를 작성하는 자세로 임해야

 


아이템 89. 인스턴스 수를 통제해야 한다면 readResolve보다는 열거 타입을 사용하라 
아이템 90. 직렬화된 인스턴스 대신 직렬화 프록시 사용을 검토하라 

728x90

'스터디 > 이펙티브 자바 스터디' 카테고리의 다른 글

11장 : 동시성  (0) 2023.04.22
10장 : 예외  (0) 2023.04.21
9장 : 일반적인 프로그래밍 원칙  (0) 2023.04.15
8장 : 메서드  (0) 2023.04.06
7장 : 람다와 스트림  (0) 2023.04.06