本文來自http://yanwushu.sinaapp.com/parcelable-vs-serializable/
在開發android程序過程中,我們都遇到過使用bundle在activity之間傳遞對象的問題。實現使用bundle傳遞對象,有兩種選擇,一種是將對象通過Serialize(序列化)的方式傳遞,一種是將對象通過parcel(打包)的方式傳遞。本文比較這兩種方式的區別。
Serializable簡單爲主
public class SerializableDeveloperimplements Serializable Stringname; intyearsOfExperience; List<Skill>skillSet; floatfavoriteFloat; staticclass Skill implements Serializable { Stringname; booleanprogrammingRelated; } }
使用序列化方式實現對象傳遞的時候,只需要類及其內部類實現java.io.serialiable接口即可。java.io.serializable是一個沒有任何待實現方法的標記接口。
序列化底層使用反射實現,效率較低,因爲反射機制會生成大量的臨時對象,並且直接對GC產生壓力。
Parcelable高效是王
class ParcelableDeveloperimplements Parcelable { Stringname; intyearsOfExperience; List<Skill>skillSet; floatfavoriteFloat; ParcelableDeveloper(Parcelin) { this.name= in.readString(); this.yearsOfExperience= in.readInt(); this.skillSet= new ArrayList<Skill>(); in.readTypedList(skillSet,Skill.CREATOR); this.favoriteFloat= in.readFloat(); } voidwriteToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(yearsOfExperience); dest.writeTypedList(skillSet); dest.writeFloat(favoriteFloat); } intdescribeContents() { return0; } staticfinal Parcelable.Creator<ParcelableDeveloper> CREATOR =new Parcelable.Creator<ParcelableDeveloper>() ParcelableDevelopercreateFromParcel(Parcel in) { returnnew ParcelableDeveloper(in); } ParcelableDeveloper[]newArray(int size) { returnnew ParcelableDeveloper[size]; } }; staticclass Skill implements Parcelable { Stringname; booleanprogrammingRelated; Skill(Parcelin) { this.name= in.readString(); this.programmingRelated= (in.readInt() == 1); } @Override voidwriteToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(programmingRelated? 1 : 0); } staticfinal Parcelable.Creator<Skill> CREATOR =new Parcelable.Creator<Skill>() { SkillcreateFromParcel(Parcel in) { returnnew Skill(in); } Skill[]newArray(int size) { returnnew Skill[size]; } }; @Override intdescribeContents() { return0; } } }
根據google工程師的的觀點,這種實現效率更高。原因之一是我們自己指定而非使用反射機制實現了保存和恢復的過程。並且在這個過程的自我實現中可以進行有效的優化。
然而,很顯然,實現parcelable接口很費工夫,並且代碼閱讀性較低。
性能測試
下面比較兩種實現方式具體的性能差異。
· 通過將對象放到bundle中並且取出,模仿activity傳遞對象的操作
· 重複這個過程1000次
· 執行十次取平均值
· 使用上文中的SerializableDeveloper和ParcelableDeveloper 進行測試
· 測試在下面三種設備上進行
o LG Nexus 4 – Android 4.2.2
o Samsung Nexus 10 – Android 4.2.2
o HTC Desire Z – Android 2.3.3
Nexus 10
Serializable: 1.0004ms, Parcelable: 0.0850ms
Nexus 4
Serializable: 1.8539ms –Parcelable: 0.1824ms
Desire Z
Serializable: 5.1224ms –Parcelable: 0.2938ms.
如你所見,parcelable方式要比序列化方式快十倍以上,並且,即使再小的對象,也要花費一毫秒以上的時間才能完成一個序列化和反序列化的過程。
選擇
兩種實現方式的區別在於實現過程的簡易程度和執行速度,開發人員應該在這兩者之間找到適合自己的平衡點。
資源