도당탕탕
Item90 : Serialized 인스턴스 대신 Serialization Proxy를 사용하라. 본문
Serialization Proxy Pattern
enclosing class의 logical state를 정확히 나타내는 nested class를 정의하는 방법
public final class Period implements Serializable {
private final Date start;
private final Date end;
public Period(Date start, Date end) {
this.start = new Date(start.getTime());
this.end = new Date(end.getTime());
if (this.start.compareTo(this.end) > 0)
throw new IllegalArgumentException(start + " after " + end);
}
public Date start() {
return new Date(start.getTime());
}
public Date end() {
return new Date(end.getTime());
}
public String toString() {
return start + " - " + end;
}
// Serialization proxy for Period class - page 312
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 static final long serialVersionUID = 234098243823485285L; // Any
private Object readResolve() {
return new Period(start, end); // Uses public constructor
}
}
private Object writeReplace() {
return new SerializationProxy(this);
}
private void readObject(ObjectInputStream stream)
throws InvalidObjectException {
throw new InvalidObjectException("Proxy required");
}
}
장점
- 사용이 쉽다.
- 생성자를 통해서 객체를 리턴하게 되므로 앞에서 이야기한 공격에 안전함.
- 직렬화할 때의 클래스타입과 역직렬화할 때의 클래스타입이 달라도 상관없음.
단점
- 순환 참조를 가지고 있는 객체, 사용자에 의해서 상속될 수 있는 클래스에는 사용이 불가능
- 직열화, 역직렬화 속도가 약간 느림
'JAVA' 카테고리의 다른 글
Item89 : 인스턴스 수를 통제해야 한다면 readResolve보다는 열거 타입을 사용하라 (0) | 2023.02.13 |
---|---|
Item88 : 방어적으로 READOBJECT 함수를 사용하라. (0) | 2023.02.09 |
Item87 : 커스텀 직렬화 형태를 고려해보라 (0) | 2023.02.09 |
Item86 : SERIALIZABLE을 구현할때는 주의해서 하라. (0) | 2023.02.08 |
Item85 : 자바 직렬화의 대안을 찾으라 (0) | 2023.02.08 |
Comments