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