在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.html】spa
二、修改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 }