原創文章,轉載請注明出處:http://www.cnblogs.com/baipengzhan/p/6296121.html
Android開發中,我們經常用到JavaBean類以及序列化的知識,但經常用並不代表能夠深入理解,
今天我希望來總結一下JavaBean類和序列化知識,以便讓自己理解的更加深入。
首先說一下JavaBean類,我們在Android開發中對JavaBean類的概念沒有非常嚴格,在JSP開發中,Bean類
有相對嚴格的規范,這里http://wiki.netbeans.org/NetBeansJavaBeansTutorial,是Wiki上SUN公司的
一些定義,比如一些命名的規則,必須有一個空的構造方法等等規定,有些Bean類的規范還要求必須實現序列
化。但我們在Java開發中使用到的Bean類並沒有那么嚴格,這是因為用途不同。我們在Android開發中使用Bean
類最多的場景是從網絡獲取數據,將數據以Bean類組織,Bean類中的數據用於填充UI界面中的控件。此處使用
Bean類主要是組織數據方便,便於將其中的數據填充到控件中。
再說一下序列化,序列化的作用是①將對象的狀態保存在存儲媒體中以便可以在以后重新創建出完全相同的副本;
②按值將對象從一個應用程序域發送至另一個應用程序域或者進行網絡傳輸。
Android中的對象序列化的過程是將對象轉化為字節數組,反序列化就是將字節數組重新恢復成對象。
我們在Android開發中,一般在Bundle,intent傳遞Bean類對象(或包含Bean類的集合)時,需要進行序列化;
在IPC機制中也用到了Bean類的序列化。注意,傳遞的Bean類對象,並不是原對象本身,而是原對象的復制,
兩者的地址不一樣,但其他值是一樣的。當在不同Activity見傳遞對象時,因為不是傳遞的原對象的引用,從而
避免了內存泄漏。
我們再用通俗一些的語言說一下序列化的作用:
①就是將對象的狀態保存在磁盤上,當程序不運行時,該狀態不消失,下次程序運行時讀取該狀態,恢復對象,
更直白一些,就是保存。當然保存的方法有很多很多種,這個只是一種,且主要針對實體類;
②在Activity之間,Activity和Fragment之間,進程間,傳遞對象,或者網絡傳遞對象,這個時候傳遞的是序
列化后的Byte數組,也就是方便傳輸,不易出錯,不同程序間兼容性更好;
可看到有人這樣理解序列化的作用:
也就是換個時間,換個地點使用對象信息
換個時間,就是先將對象信息存盤,等需要的時候再次讀取,說的是同一個Activity或者Fragment對Bean類信息的使用;
換個地點,也就是不同Activity或者Fragment,或者不同進程,甚至不同程序對Bean類信息的使用。
兩種序列化的區別:
①實現Serializable接口由JavaSE支持,而實現Parcelable接口是Android特有的。實現Parcelable比實現Serializable
效率高,但用法稍微復雜;
②實現Serializable接口,只需要我們標記一下,系統自動將對象序列化;實現Parcelable接口,還需要實例化靜態內部
變量CREATOR,需要我們操作輔助實現序列化;
③在使用內存的時候,Parcelable的性能比Serializable好,在內存開銷方面較小,所以在內存間數據傳輸時推薦使用Parcelable,如activity間傳輸數據;
④在永久化保存對象的時候,Serializable可以實現,所以在需要保存或網絡傳輸數據時選擇Serializable。
Parcelable不能用在需要將對象存儲在磁盤的情況下,且因為android不同版本Parcelable可能不同,所以不推薦使用Parcelable進行數據持久化;
⑤Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC,影響效率;
本篇文章沒有敘述嚴格定義,其中的嚴格概念今后會在的文章中具體闡明。