Parcelbale接口

参考链接

Parcelable接口相对Serializable接口比较复杂,但是有一套模板代码可以参考,所有的实现Parcelable接口的类都跟模板代码类似。

 1 package com.example.murphy.helloworld;
 2 
 3 import android.app.Person;
 4 import android.os.Parcel;
 5 import android.os.Parcelable;
 6 
 7 public class UserP implements Parcelable {
 8     private String account;
 9     private String password;
10 
11     //创建私有构造器,供CREATOR使用,从Parce回复数据
12     private UserP(Parcel in) {
13         account = in.readString();
14         password = in.readString();
15     }
16 
17     //用来恢复自定义对象
18     public static final Creator<UserP> CREATOR=new Creator<UserP>() {
19         @Override
20         public UserP createFromParcel(Parcel source) {
21             return new UserP(source);
22         }
23 
24         @Override
25         public UserP[] newArray(int size) {
26             return new UserP[size];
27         }
28     };
29 
30 
31     @Override
32     public int describeContents() {
33         return 0;
34     }
35 
36     /*将数据写到Parce中*/
37     @Override
38     public void writeToParcel(Parcel dest, int flags) {
39         dest.writeString(password);
40         dest.writeString(account);
41     }
42 }

 序列化之后可使用Bundle的putParcelable的方法,将实现Parcelable接口的对象放进bundle打包进Intent然后传送。

序列化功能由writeToParcel来完成,最终是通过Parcel中的一系列write方法来完成的;反序列化功能由CREATOR来完成,其内部表明了如何创建序列化对象和数据,并通过Parcel的一系列read方法来完成反序列化的过程;内容描述功能由describeContents方法来完成,几乎在所有情况下这个方法都是返回0,仅当当前对象中存在文件描述符时,此方法返回1.需要注意的是,由于person是另一个可序列化对象,所以它的反序列化过程需要传递当前线程的上下文类加载器,否则会报无法找到类的错误。
 
Serializable和Parcelable选择哪个?

Serializable是Java中的序列化接口,其使用起来简单但是开销很大,序列化和反序列化过程需要大量I\O操作。而Parcelable是Android中序列化方式,因此更适合用在Android平台上,它的缺点是使用起来稍微复杂一点,但是因为有一套模板,所以这点复杂还是可以接受的,而且它的效率很高,这也是Android推荐的序列化方式,因此在Android平台上首选Parcelable。

posted @ 2019-03-05 23:30  找不到实习的学渣  阅读(149)  评论(0编辑  收藏  举报