考虑用序列化代理代替序列化实例
前提:使用Serializable接口会增加出错和出现安全问题的可能性(因为他导致实例要利用语言之外的机制来创建,而不是普通的构造器)
解决方案:使用序列化代理模式
- 为可序列化的类设计一个私有的静态嵌套类,精确的表示外围类的实例的逻辑状态,这个嵌套类就是序列化代理
- 嵌套类具有一个单独的构造器,参数类型就是外围类,这个构造器只从它的参数中复制数据(不进行一致性检查和保护性拷贝)
- 序列化的时候使用代理类
- 反序列化的时候创建外部类
public final class Period {
private final Date start;
private final Date end;
public Period(Date start, Date end) {
if (start.compareTo(end) > 0) {
throw new IllegalArgumentException(start + "after" + end);
}
this.start = start;
this.end = end;
}
public Date start() {
return start;
}
public Date end() {
return end;
}
/**
* 这个方法的存在导致序列化系统产生一个代理实例,替代原对象
* 序列化系统永远不会产生该类的实例
* @return
*/
private Object writeReplace() {
return new SerializationProxy(this);
}
private static class SerializationProxy implements Serializable {
priva