Android之路

导航

自定义类对象实现了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 }

 

posted on 2019-07-25 10:39  Android之路  阅读(868)  评论(0编辑  收藏  举报