本文詳細對Android中Serializable和Parcelable序列化對象進行學習,具體內容如下
學習內容:
1.序列化的目的
2.Android中序列化的兩種方式
3.Parcelable與Serializable的性能比較
4.Android中如何使用Parcelable進行序列化操作
5.Parcelable的工作原理
6.相關實例
1.序列化的目的
1).永久的保存對象數據(將對象數據保存在文件當中,或者是磁盤中
2).通過序列化操作將對象數據在網絡上進行傳輸(由于網絡傳輸是以字節流的方式對數據進行傳輸的.因此序列化的目的是將對象數據轉換成字節流的形式)
3).將對象數據在進程之間進行傳遞(Activity之間傳遞對象數據時,需要在當前的Activity中對對象數據進行序列化操作.在另一個Activity中需要進行反序列化操作講數據取出)
4).Java平臺允許我們在內存中創建可復用的Java對象,但一般情況下,只有當JVM處于運行時,這些對象才可能存在,即,這些對象的生命周期不會比JVM的生命周期更長(即每個對象都在JVM中)但在現實應用中,就可能要停止JVM運行,但有要保存某些指定的對象,并在將來重新讀取被保存的對象。這是Java對象序列化就能夠實現該功能。(可選擇入數據庫、或文件的形式保存)
5).序列化對象的時候只是針對變量進行序列化,不針對方法進行序列化.
6).在Intent之間,基本的數據類型直接進行相關傳遞即可,但是一旦數據類型比較復雜的時候,就需要進行序列化操作了.
2.Android中實現序列化的兩種方式
1).Implements Serializable 接口 (聲明一下即可)
Serializable 的簡單實例:
public class Person implements Serializable{ private static final long serialVersionUID = -7060210544600464481L; private String name; private int age; public String getName(){ return name; } public void setName(String name){ this.name = name; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; }}2).Implements Parcelable 接口(不僅僅需要聲明,還需要實現內部的相應方法)
Parcelable的簡單實例:
注:寫入數據的順序和讀出數據的順序必須是相同的.
public class Book implements Parcelable{ private String bookName; private String author; private int publishDate; public Book(){ } public String getBookName(){ return bookName; } public void setBookName(String bookName){ this.bookName = bookName; } public String getAuthor(){ return author; } public void setAuthor(String author){ this.author = author; } public int getPublishDate(){ return publishDate; } public void setPublishDate(int publishDate){ this.publishDate = publishDate; } @Override public int describeContents(){ return 0; } @Override public void writeToParcel(Parcel out, int flags){ out.writeString(bookName); out.writeString(author); out.writeInt(publishDate); } public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>(){ @Override public Book[] newArray(int size){ return new Book[size]; } @Override public Book createFromParcel(Parcel in){ return new Book(in); } }; public Book(Parcel in){ //如果元素數據是list類型的時候需要: lits = new ArrayList<?> in.readList(list); 否則會出現空指針異常.并且讀出和寫入的數據類型必須相同.如果不想對部分關鍵字進行序列化,可以使用transient關鍵字來修飾以及static修飾. bookName = in.readString(); author = in.readString(); publishDate = in.readInt(); }}我們知道在Java應用程序當中對類進行序列化操作只需要實現Serializable接口就可以,由系統來完成序列化和反序列化操作,但是在Android中序列化操作有另外一種方式來完成,那就是實現Parcelable接口.也是Android中特有的接口來實現類的序列化操作.原因是Parcelable的性能要強于Serializable.因此在絕大多數的情況下,Android還是推薦使用Parcelable來完成對類的序列化操作的.
3.Parcelable與Serializable的性能比較
首先Parcelable的性能要強于Serializable的原因我需要簡單的闡述一下
1). 在內存的使用中,前者在性能方面要強于后者
2). 后者在序列化操作的時候會產生大量的臨時變量,(原因是使用了反射機制)從而導致GC的頻繁調用,因此在性能上會稍微遜色
3). Parcelable是以Ibinder作為信息載體的.在內存上的開銷比較小,因此在內存之間進行數據傳遞的時候,Android推薦使用Parcelable,既然是內存方面比價有優勢,那么自然就要優先選擇.
4). 在讀寫數據的時候,Parcelable是在內存中直接進行讀寫,而Serializable是通過使用IO流的形式將數據讀寫入在硬盤上.
但是:雖然Parcelable的性能要強于Serializable,但是仍然有特殊的情況需要使用Serializable,而不去使用Parcelable,因為Parcelable無法將數據進行持久化,因此在將數據保存在磁盤的時候,仍然需要使用后者,因為前者無法很好的將數據進行持久化.(原因是在不同的Android版本當中,Parcelable可能會不同,因此數據的持久化方面仍然是使用Serializable)
速度測試:
測試方法:
1)、通過將一個對象放到一個bundle里面然后調用Bundle#writeToParcel(Parcel, int)方法來模擬傳遞對象給一個activity的過程,然后再把這個對象取出來。
2)、在一個循環里面運行1000 次。
3)、兩種方法分別運行10次來減少內存整理,cpu被其他應用占用等情況的干擾。
4)、參與測試的對象就是上面的相關代碼
5)、在多種Android軟硬件環境上進行測試