国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中使用Parcelable實現對象的序列化

2019-11-09 17:51:14
字體:
來源:轉載
供稿:網友

在Android開發中,Parcelable是一個接口,只要實現這個接口,一個類的對象就可以實現序列化并可通過Intent和Binder傳遞。序列化的目的是傳遞數據用。

下面給出一個實體類的序列化實例,大家可以參考這樣來寫,因為寫法都是一樣的:public class User implements Parcelable{ // 當前實體類的三個屬性 public int userId; public String userName; public boolean isMale; // 另外的實體類對象 public Book book; // 添加一個有參的構造方法 public User(int userId, String userName, boolean isMale) { super(); this.userId = userId; this.userName = userName; this.isMale = isMale; } /** * 內容描述功能的實現 */ @Override public int describeContents() { // TODO Auto-generated method stub return 0; } /** * 序列化功能實現 */ @Override public void writeToParcel(Parcel dest, int flags) { // TODO Auto-generated method stub dest.writeInt(userId); dest.writeString(userName); dest.writeInt(isMale ? 1:0); dest.writeParcelable(book, 0); } /** * 反序列化功能的實現 */ public static final Parcelable.Creator<User> CREATOR = new Creator<User>() { // 創建指定長度的原始對象數組 @Override public User[] newArray(int size) { // TODO Auto-generated method stub return new User[size]; } // 從序列化后的對象中創建原始對象 @Override public User createFromParcel(Parcel source) { // TODO Auto-generated method stub return new User(source); } }; PRivate User(Parcel source){ userId = source.readInt(); userName = source.readString(); isMale = source.readInt() == 1; // 由于book是一個可序列化的對象,所以它的反序列化過程需要傳遞當前線程的上下文加載器,否則會報無法找到類的錯誤。 book = source.readParcelable(Thread.currentThread().getContextClassLoader()); }}從上述代碼可以看出,在序列化過程中需要實現的功能有:序列化、反序列化和內容描述。

序列化功能由writeToParcel方法來完成,最終是通過Parcel中的一系列write方法來完成的; 反序列化功能由CREATOR來完成,其內部標明了如何創建序列化對象和數組,并通過Parcel的一系列read方法來完成反序列化的過程; 內容描述功能由describeContents方法來完成,幾乎所有情況下這個方法都應該返回0,僅當當前對象中存在文件描述符時,此方法返回1。

詳細的方法說明請看下表:
方法 功能 標記位
createFromParcel(Parcel source) 從序列化后的對象中創建原始對象
newArray(int size) 創建指定長度的原始對象數組
User(Parcel source) 從序列化后的對象中創建原始對象
writeToParcel(Parcel dest,int flags) 將當前對象寫入序列化結構中,其中flags標識有兩種值:0或者1(參見右側標記位)。為1時標識當前對象需要作為返回值返回,不能立即釋放資源,幾乎所有情況都為0 PARCELABLE_WRITE_RETURN_VALUE
describeContents 返回當前對象的內容描述。如果含有文件描述符,返回1,(參見右側標記位),否則返回0,幾乎所有情況都返回0 CONTENTS_FILE_DESCRipTOR

Android系統也有許多實現了Parcelable接口的類,它們都是可以直接序列化的,比如Intent、Bundle、Bitmap等,同時List和Map也可以序列化,前提是它們里面的每一個元素都是可序列化的。

當然還有Serializable也可以實現序列化,由于實現Serializable接口序列化的方法較為簡單,這里就不多說了。就說一下Parcelable和Serializable實現序列化的時候,二者該如何選擇。 Serializable是java中的序列化接口,其使用起來簡單,但是開銷很大,序列化和反序列化過程需要消耗大量的I/O操作。而Parcelable是 Android中的序列化方式,因此更適合用在Android平臺上,它的缺點就是使用起來稍微麻煩點,但是效率很高,這是Android推薦的序列化方式,因此我們要首選Parcelable。 Parcelable主要用在內存序列化上,通過Parcelable將對象序列化到存儲設備中或者將對象序列化后通過網絡傳輸也都是可以的,但是這個過程會稍顯復雜,因此在這兩種情況下建議大家使用Serializable。以上就是兩者的區別。


每天進步一點點!加油!


上一篇:android 屬性動畫

下一篇:SQLite android

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 合阳县| 天镇县| 长阳| 灵川县| 乐昌市| 福州市| 宿迁市| 罗田县| 安宁市| 张北县| 兴安县| 金华市| 马尔康县| 兴和县| 衡阳市| 清流县| 乐业县| 隆昌县| 桃源县| 溧阳市| 镇安县| 云和县| 平利县| 遂川县| 吴旗县| 吉安县| 屏边| 密山市| 西乡县| 玛曲县| 靖州| 四会市| 连州市| 商丘市| 惠安县| 昭通市| 乌兰察布市| 唐河县| 格尔木市| 苍南县| 瑞昌市|