自定義類對象實現了Parcelable或Serializable接口的注意事項

    在Android應用程序內部,一般咱們會使用Bundle進行數據的傳遞,除了基本的數據類型外,還能夠傳遞類對象,而要求是該類實現了Parcelable或Serializable序列化接口。html

假設自定義類爲Book:java

一、實現了Serializable接口,運行時拋出異常:android

02-27 10:45:58.779: E/AndroidRuntime(14811): Caused by: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object
(name = com.example.testinter.MainActivity$Disk)
可能的緣由:
安全

(1)類Book訪問權限有問題,例:屬於某個類的內部類。此時能夠將Book定義爲static或將Book定義爲獨立的類Book.java。ide

(2)類Book中存在其餘未實現Serializable的類對象。例如:Bitmap,查看API可發現其實現的是Parcelable接口,此時須要將Book改成實現Parcelable接口。【原文參考http://www.cnblogs.com/mengyan1124/p/5765580.htmlspa

二、修改Book將其獨立出來寫成一個單獨的類Book.java,並實現Parcelable接口,實現該接口有點複雜,具體注意事項以下:code

(1)定義靜態常量Parcelable.Creator<Book> CREATOR;htm

(2)屬性字段的讀寫順序保持一致;對象

(3)若是有寫入字段並不在寫入順序的末尾,則必須讀取,不然,其後的全部字段在讀取時都會出錯。所以,若某個字段不讀取,則不要將其寫入或將其放在寫入順序的末尾。建議:爲了安全起見,寫入的字段都讀取,若不讀取,該字段就沒有存在的意義。blog

最後附上修改後的Book.java

 1 package com.example.testinter;  2  3 import android.graphics.Bitmap;  4 import android.os.Parcel;  5 import android.os.Parcelable;  6  7 public class Book implements Parcelable{  8  9 public int id; 10 11 public int ISBN; 12 13 public String des; 14 15 public Bitmap bitmap; 16 17 public Book(){} 18 19 //讀取順序: id--->bitmap--->des--->ISBN 20 //且若是有寫入字段並不在順序的末尾,則必須讀取,不然,其後的全部字段在讀取時都會出錯. 21 public Book(Parcel parcel) { 22 // TODO Auto-generated constructor stub 23 id = parcel.readInt(); 24 bitmap = parcel.readParcelable(Bitmap.class.getClassLoader()); //Bitmap的讀取 25 des = parcel.readString(); 26 ISBN = parcel.readInt(); 27  } 28 29  @Override 30 public int describeContents() { 31 // TODO Auto-generated method stub 32 return 0; 33  } 34 35 //寫入順序:id--->bitmap--->des--->ISBN 36  @Override 37 public void writeToParcel(Parcel parcel, int flags) { 38 // TODO Auto-generated method stub 39  parcel.writeInt(id); 40 parcel.writeParcelable(bitmap, flags); //Bitmap的寫入 41  parcel.writeString(des); 42  parcel.writeInt(ISBN); 43  } 44 45 public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() { 46 47  @Override 48 public Book[] newArray(int sizes) { 49 // TODO Auto-generated method stub 50 return new Book[sizes]; 51  } 52 53  @Override 54 public Book createFromParcel(Parcel parcel) { 55 // TODO Auto-generated method stub 56 return new Book(parcel); 57  } 58  }; 59 }
相關文章
相關標籤/搜索