java序列化-Serializable

 
1、實現Serializable回導致發佈的API難以更改,並且使得package-private和private
這兩個本來封裝的較好的咚咚也不能得到保障了
2、Serializable會爲每個類生成一個序列號,生成依據是類名、類實現的接口名、
public和protected方法,所以只要你一不小心改了一個已經publish的API,並且沒有自
己定義一個long類型的叫做serialVersionUID的field,哪怕只是添加一個getXX,就會
讓你讀原來的序列化到文件中的東西讀不出來(不知道爲什麼要把方法名算進去?)
3、不用構造函數用Serializable就可以構造對象,看起來不大合理,這被稱爲
extralinguistic mechanism,所以當實現Serializable時應該注意維持構造函數中所維
持的那些不變狀態
4、增加了發佈新版本的類時的測試負擔
5、1.4版本後,JavaBeans的持久化採用基於XML的機制,不再需要Serializable
6、設計用來被繼承的類時,儘量不實現Serializable,用來被繼承的interface也不要
繼承Serializable。但是如果父類不實現Serializable接口,子類很難實現它,特別是
對於父類沒有可以訪問的不含參數的構造函數的時候。所以,一旦你決定不實現
Serializable接口並且類被用來繼承的時候記得提供一個無參數的構造函數
7、內部類還是不要實現Serializable好了,除非是static的,(偶也覺得內部類不適合
用來幹這類活的)
8、使用一個自定義的序列化方法
看看下面這個保存一個雙向鏈表的例子:




這樣會導致鏈表的每個元素以及元素之間的關係(雙向鏈表之間的連接)
都保存下來,更好的方法是提供一個自定義的序列化如下:
9、不管你選擇什麼序列化形式,聲明一個顯式的UID:
private static final long serialVersionUID = randomLongValue;
10、不需要序列化的東西使用transient注掉它吧,別什麼都留着
11、writeObject/readObject重載以完成更好的序列化
readResolve 與 writeReplace重載以完成更好的維護invariant controllers
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章