在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 }