Android中的Serializable、Parcelable
Parcelable

這是一個接口,它的實例可以寫入Parcel或從Parcel恢復。實現Parcelable的類必須要有一個實現了Parcelable.Creator接口的類型的非空靜態字段CREATOR,這個字段是幫忙從一個Parcel產生一個Parcelable類的實例。
public class MyParcelable implements Parcelable { private int mData; public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { out.writeInt(mData); } public static final Parcelable.Creator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
describeContents()用于描述Parcelable類實例的
writeToParcel(Parcel dest, int flags)用于將數據扁平化寫入Parcel
Parcel是一個消息(數據或對象引用)容器,它可以通過IBinder來發送,也就是說 Parcelable實例十分合適作來進程間通信的消息載體。
在java中使用Serializable接口實現對象的序列化,而在android中既可以使用Serializable也可以使用Parcelable接口實現對象序列化,如果只在內存操作時則傾向Parcelable接口,傳輸效率會更高效。
注意:Parcelable只能對內存對象序列化,不能對需要存儲在文件或SD等設備進行序列化,如果需要將對象序列化存儲到文件,實現Serializable接口就可以了
Serializable是java提供的一個序列化接口,它是一個空接口,專門為對象提供標準的序列化和反序列化操作,用它實現類的序列化比較簡單,只要在類聲明中實現Serializable接口即可。
public class User implements Serializable { private static final long serialVersionUID = -4454266436543306544L; private String name; /** * age */ private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
由于serialVersionUID是用來輔助序列化和反序列化過程的,原則上序列化后的對象中serialVersionUID只有和當前類的serialVersionUID相同才能夠正常被反序列化,也就是說序列化與反序列化的serialVersionUID必須相同才能夠使序列化操作成功。序列化操作的時候系統會把當前類的serialVersionUID寫入到序列化文件中,當反序列化時系統會去檢測文件中的serialVersionUID,判斷它是否與當前類的serialVersionUID一致,如果一致就說明序列化類的版本與當前類版本是一樣的,可以反序列化成功,否則失敗。因此強烈建議指定serialVersionUID,這樣的話即使微小的變化也不會導致crash的出現,否則文件多一個空格或類的結構有些許變化都會反序列化失敗。默認情況下,系統會根據類結構自動生成的serialVersionUID,因此當類稍有變化,自動生成的UID就會與之前存在文件中的不一樣,就會反序列化失敗。因此有必要指定serialVersionUID,那么系統就會盡可能地序列化。
需要注意的是如果反序列的類的成員變量的類型或者類名發生了變化,即使serialVersionUID相同反序列化會失敗。其次是靜態成員變量屬于類不屬于對象,不會參與序列化過程,使用transient關鍵字標記的成員變量也不參與序列化過程。
Serializable在內存序列化是(將數據持久化在磁盤)上開銷比較大,如Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC(垃圾回收),而內存資源對于android系統來說是十分稀有的(首先,我們每個應用都會運行在各自的虛擬機上,而android系統分配給每個虛擬機的內存開銷都是十分有限的)。因此android中提供了Parcelable接口來實現序列化操作,Parcelable的性能比Serializable好,在內存開銷方面較小,所以在內存間數據傳輸時推薦使用Parcelable,如通過Intent在activity間傳輸數據,進程間通信也推薦使用Parcelable
Android Parcel
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。