선언부에 "implements Serializable"을 붙이는 순간 이 클래스는 더 이상 싱글턴 클래스가 아니다. readObject 메서드는 새로 생성된 객체를 반환하는데, 이 객체는 클래스가 초기화될 당시에 만들어진 객체와 같은 객체가 아니다. readResolve를 이용하면 readObject가 만들어낸 객체를 다른 것으로 대체할 수 있다. 역지렬화가 끝나서 만들어진 객체에 대해 이 메서드가 호출되는데, 새로 만들어진 객체 대신, 이 메서드가 반환하는 객체가 사용자에게 반환된다는 것이다.
싱글턴 객체처럼, 개체 통제를 위해 readResolve를 활용할 때는, 객체 참조 자료형으로 선언된 모든 객체 필드를 반드시 transient로 선언해야 한다. 이러한 규칙을 지키지 않으면 아래의 오류가 발생할 수 있디/
하지만 readResolve 메서드가 실행되기 전에 역직렬화된 객체에 대한 참조를 가로 칠 수 있게된다.
요약
'개발서적 > 이펙티브자바' 카테고리의 다른 글
[직렬화]규칙78. 직렬화된 객체 대신 직렬화 프락시를 고려해 보라 (0) | 2017.05.10 |
---|---|
[직렬화]규칙76. readObject 메서드는 방어적으로 구현하라 (0) | 2017.05.10 |
[직렬화]규칙75. 사용자 지정 직렬화 형식을 사용하면 좋을지 따져 보라 (0) | 2017.05.09 |
[직렬화]규칙74. Serializable 인터페이스를 구현할 때는 신중하라 (0) | 2017.05.09 |
[병행성]규칙73. 스레드 그룹은 피하라 (0) | 2017.05.08 |