Parcelable
Parcelable是android.os.Parcelable提供的Android平臺進行序列化的接口。在writeToParcel()通過底層Parcel中一些列write()方法完成序列化瞬项;在YourParcelable.CREATOR內(nèi)部如何創(chuàng)建序列化對象和數(shù)組撑教,通過Parcel中一些列read()方法完成反序列化穆趴;describeContents()完成內(nèi)容描述功能北秽。
使用Parcelable進行序列化流程
1. 繼承Parcelable接口;
2. 覆寫describeContents()呢铆、writeToParcel()方法(Implement methods)贷屎;
3. 添加Parcel形參的構(gòu)造函數(shù)罢防,公有靜態(tài)常量CREATOR(Add Parcelable Implementation)。
補充:Android Studio插件:Android Parcelable code generator插件唉侄。寫完實體類后在Generate界面(Alt + Insert鍵)選擇Parcelable一鍵生成咒吐。
Serializable
Serializable是Java提供的序列化借口,是一個空接口属划,依賴serialVersionUID將對象序列化到文件或其他中介恬叹,反序列化時如果類結(jié)構(gòu)及serialVersionUID匹配就反序列化出對象。采用ObjectOutputStream和ObjectInputStream進行同眯。
注意
1. 序列化前绽昼、后的對象內(nèi)容完全一樣,但不是同一個對象须蜗;
2. serialVersionUID不是必須指定的硅确。系統(tǒng)會計算當前對象的Hash值將它賦值給serialVersionUID;
3. 如果serialVersionUID不匹配明肮,反序列化時會crash如下異常:java.io.InvalidClassException菱农;
擴展
1. 靜態(tài)成員變量屬于類,不會參與序列化過程柿估;
2. 用transient關(guān)鍵字修飾的成員變量不參與序列化過程循未;
3. 可覆寫writeObject()、readObject()改變系統(tǒng)默認的系列化過程官份;
4. 可使用此類的子類Externalizable對序列化進行自定義控制只厘;
Parcelable和Serializable差別
1.Parcelable主要用于內(nèi)存序列化,當需要序列化到存儲設(shè)備或進行網(wǎng)絡(luò)傳輸會相對復(fù)雜更適用Serializable舅巷;
2. 默認的Serializable使用反射消耗性能,可通過自定義writeObject()和readObject()優(yōu)化性能河咽;
注意
1. 在Android平臺中Serializable在Parcel.writeValue()中將序列化到ByteArrayOutputStream內(nèi)存中钠右;
2.Serializable在writeObject()和readObject()中直接進行流的讀寫會繞開反射,提升性能忘蟹;
3.Serializable只是人們常用磁盤序列化飒房,它也支持其他中介進行搁凸。性能并不低。
參考文獻
詳細介紹Android中Parcelable的原理和使用方法
Android序列化完全解析(一)-Java Serializable? 一個系列的狠毯,5*推薦