學習java的同學注意了?。。?nbsp;學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986 我們一起學Java!
在effective Java中列舉出了java序列化要注意的一些問題:
謹慎地設計實現Serializable接口實現發布了就是一種承諾如果一個類是為繼承設計的,在‘允許子類實現Serializable接口’與‘禁止子類實現Serializable接口’取一個折中的方案是:提供一個可訪問的無參構造器保護性地編寫 readObject()方法,因為readObject()是構建實例的入口。不保護可能出現 構建了不滿足要求的 實例考慮自定義的序列化形式邏輯內容 與 物理表示法如果一個對象的 ‘物理表示法’等同于它的‘邏輯內容’,可能就適用于使用默認的序列化形式。如果有更好的 ‘物理表示法’在表示‘邏輯內容’則可以自定義序列化形式。[java] view plain copypublic class StringList implements Serializable { private transient int size = 0; private transient Entity head = null; public final void add(String str) { // ... } private static class Entity { String data; Entity next; Entity previous; } private void writeObject(ObjectOutputStream s) throws IOException { s.defaultWriteObject(); s.write(size); for (Entity e = head; e != null; e = e.next) { s.writeObject(e.data); } } private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { s.defaultReadObject(); int num = s.read(); for (int i = 0; i < num; i++) { this.add((String) s.readObject()); } } }序列化機制提供的鉤子函數有:
writeReplace writeObject readObject readResolve
writeReplace:序列化的時候替換所要序列化的對象。writeObject:寫入序列化的對象 readObject:讀取序列化的對象readResolve:最后返回序列化對象[java] view plain copyimport java.io.InvalidObjectException; import java.io.ObjectInputStream; import java.io.Serializable; import java.util.Date; public final class Period implements Serializable { private static final long serialVersionUID = 100L; 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; } // 不給 private Object writeReplace() { return new SerializationProxy(this); } private void readObject(ObjectInputStream stream) throws InvalidObjectException { throw new InvalidObjectException("proxy request"); } 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 Object readResolve() { return new Period(start, end); } private static final long serialVersionUID = 1000L; } }學習Java的同學注意了?。。?nbsp;學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986 我們一起學Java!
新聞熱點
疑難解答