這是開始文章http://blog.csdn.net/tlycherry/article/details/8986720。(我引用他人的)最少你要瞭解到
1、什麼是序列化
2、對象流是什麼(可以思考下原型模式)
3、序列化能做什麼
4、實現序列化的方法
5、序列化的特點
進入正題:
序列化定義:用來將對象編碼成字節流,並從字節流編碼中重新構建對象。
序列化的好處:一旦一個對象被序列化,它的編碼就可以從一臺正在運行的虛擬機被傳遞到另一臺虛擬機上,或者被存儲到磁盤上,供以後反序列化使用。(對象序列化是java的一個特徵,通過該特徵可以將對象寫作一組字節碼,當在其他位置讀到這些字節碼時,可以依此創建一個新的對象,而且新對象的狀態與原對象完全相同。*)
序列化的侷限/代價:1、實現序列化接口的類,被髮布後,修改的靈活性大大降低。序列化會使得類的演變受到限制,因爲序列版本UID
2、增加了出現bug和安全漏洞的可能性。序列化機制是一種語言外的對象創建機制(*是解釋)
3、隨着發行版本,相關測試負擔增加。當一個課序列化的類被修訂後,要檢查是否可以“在新的版本中序列化一個實例,然後在舊版本中反序列化”反之亦然。
實現序列化的場景:1、如果一個類要加入到某個框架中,並且該框架依賴序列化來實現對象傳輸或者持久化,這個類需要實現序列化接口。
2、一個類要成爲另一個類的組件,並且後者必須實現序列化接口,前者實現序列化接口它就更容易被後者使用。
3、爲了繼承而設計的類應該儘量少的去實現序列化接口,用戶接口也應該儘可能的少繼承序列化接口。如果一個專門爲了繼承而設計的類是不可以序列化的,那就不要編寫可以序列化的子類。特別是父類沒有提供可以訪問的無參構造方法,子類也不可能做到序列化
在爲了繼承而設計的類中,真正實現了序列化接口的有Throwable類,Component類和HttpServlet抽象類。(是不是之前都沒想過爲什麼要實現序列化接口 就直接借用eclipse這種軟件生成了呀)
最好在所有的約束關係都已經建立的情況下再創建對象。如果微力建立這些約束關係而要求客戶端提供一些數據,這實際上就排除了使用無參構造器的可能性。盲目地爲了一個類增加無參構造器和單獨的初始化方法,而它的約束關係仍由其他構造器來建立,這樣會使得該類的狀態空間更加複雜,並增加了出錯的可能性。
一點小經驗:Date和Biginteger,大多數集合類應該實現序列化接口,代表活動實體的類不應該實現序列化接口。
實現序列化的時候要慎重。
下一篇講自定義的序列化形式