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); }