什么是序列化暑刃?
序列化 (Serialization)是將對象的狀態(tài)信息轉換為可以存儲或傳輸的形式(二進制字節(jié)流)的過程勤讽。在序列化期間蟋座,對象將其當前狀態(tài)寫入到臨時或持久性存儲區(qū)。以后脚牍,可以通過從存儲區(qū)中讀取或反序列化對象的狀態(tài)向臀,重新創(chuàng)建該對象。
- 序列化:內存中的對象 -> 磁盤
- 反序列化:磁盤 -> 內存中的對象
序列化方式
- Serializable: java提供的
- Parcelable:android提供的
Serializable和Parcelable的區(qū)別
存儲媒介
Serializable使用IO讀寫存儲在硬盤上诸狭。序列化過程使用了反射技術券膀,并且期間產生臨時對象。優(yōu)點實現簡單驯遇,缺點性能低芹彬。
Parcelable是直接在一塊共享內存中讀寫。優(yōu)點性能好妹懒,缺點實現復雜雀监。使用場景
Serializable:持久化,網絡傳輸或者本地文件存儲
Parcelable:臨時內存中傳輸眨唬,比如activity間的傳輸
Serializable使用注意事項
- Serializable在是實現時需要設置serialVersionUID会前,作用是驗證版本的一致性。在進行反序列化時匾竿,JVM會把傳來的字節(jié)流中的serialVersionUID與本地相應實體類的serialVersionUID進行比較瓦宜。如果相同說明是一致的,可以進行反序列化岭妖,否則會出現反序列化版本不一致的異常临庇,即是InvalidCastException。
- serialVersionUID兩種顯示的生成方式:
1.默認1L昵慌,比如:private static final long serialVersionUID = 1L;
2.根據類名假夺、接口名、成員方法及屬性等來生成一個64位的哈希字段斋攀,比如:private static final long serialVersionUID = xxxxL; - Seralizable無法序列化靜態(tài)變量已卷,使用transient修飾的對象也無法序列化。
- 當父類實現序列化淳蔼,子類自動實現序列化侧蘸。