Item 78. 직렬화된 객체 대신 직렬화 프락시를 고려해 보라.

직렬화 프락시 장점


class Period{
    private Object writeReplace(){
      return new SerializationProxy(this);
    }
    // 직렬화 프락시 패턴 구현을 위한 readObject 함수
    private void readObject(ObjectInputStream stream)
      throws InvalidObjectException{
      throw new InvalidObjectException("Proxy required");
    }


    // Period 클래스의 직렬화 프락시
    private static class SerializationProxy implements Serializable {
      private final Date start;
      private final Date end;
    
      SerializationProxy(Period p) {
        this.start = p.start;
        this.end = p.end;
      }
      
      private void readObject(ObjectInputStream stream){
        return new Period(start, end);
      }
    
      private static final long serialVersionUID = 2344939929329329L; // 아무 수가 가능 
    }
}

결론

클라이언트가 확장 할 수 없는 클래스에 readObjectwriteObject를 구현해야 할 때는 직렬화 프락시 패턴 도입을 고려하자.