private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { s.defaultReadObject(); start = new Date(start.getTime()); end = new Date(end.getTime()); if (start.compareTo(end) > 0) { throw new InvalidObjectException(start + "after" + end); } }
值得注意的是,这样实现后,start和end都不能再定义成final了。不过下文会介绍readResolve方法,能够做为保护性readObject的替代选择,而且保证start和end还能继续定义成final。 java
在readObject中,不管是直接方式仍是间接方式,都不要调用类中可被改写的方法。 安全
readResolve有两个用法: 函数
Peroid类的readResolve方法实现以下: 测试
private Object readResolve() throws ObjectStreamException { return new Period(start, end); }