요약
•
readObject는 방어적 복사와 매개변수 유효성 검사를 통해 방어적으로 사용하자.
readObject는 방어적으로 사용하기
•
readObject 메서드는 실질적으로 또다른 public 생성자이기 때문에, 불변식을 깨지 못하도록 다른 생성자와 똑같은 수준으로 주의를 기울여야 한다.
◦
매개변수로 받은 인수가 유효한지 검사해야 한다.
◦
필요하다면 매개변수를 방어적으로 복사해서 사용해야 한다.
•
객체를 역직렬화할 때는 클라이언트가 소유해서는 안되는 객체 참조를 갖는 필드는 반드시 모두 방어적으로 복사해야 한다.
◦
readObject에서는 불변 클래스 안의 모든 private 가변 요소를 방어적으로 복사해서 사용해야 한다.
◦
방어적 복사를 유효성 검사보다 앞서 수행해야 한다.
◦
final 한정자를 사용하면 방어적 복사가 불가능하니, final 필드를 직렬화해야 한다면 final을 제거하고 사용하자.
•
위 방법들을 적용하고 싶지 않다면, 직렬화 프록시 패턴을 사용하자.
•
final이 아닌 직렬화 클래스는 readObject 메서드가 재정의 가능한 메서드를 호출해서는 안된다.
◦
하위 클래스가 완전히 역직렬화가 되기 전에 하위 클래스에서 재정의된 메서드가 실행되어 오작동이 발생한다.