自定义类对象实现了Parcelable或Serializable接口的注意事项
在Android应用程序内部,通常我们会使用Bundle进行数据的传递,除了基本的数据类型外,还可以传递类对象,而要求是该类实现了Parcelable或Serializable序列化接口。
假设自定义类为Book:
1、实现了Serializable接口,运行时抛出异常:
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。
(2)类Book中存在其他未实现Serializable的类对象。例如:Bitmap,查看API可发现其实现的是Parcelable接口,此时需要将Book改为实现Parcelable接口。【原文参考http://www.cnblogs.com/mengyan1124/p/5765580.html】
2、修改Book将其独立出来写成一个单独的类Book.java,并实现Parcelable接口,实现该接口有点复杂,具体注意事项如下:
(1)定义静态常量Parcelable.Creator<Book> CREATOR;
(2)属性字段的读写顺序保持一致;
(3)如果有写入字段并不在写入顺序的末尾,则必须读取,否则,其后的所有字段在读取时都会出错。因此,若某个字段不读取,则不要将其写入或将其放在写入顺序的末尾。建议:为了安全起见,写入的字段都读取,若不读取,该字段就没有存在的意义。
最后附上修改后的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 }