Android中Parcelable和Serializable的区别

    Java开发中都知道有一个Serializable可以对象序列化,到了Android开发中又出来一个Parcelable,也可以实现对象的序列化。那他们都可以实现对象的序列化,那他们直接有到底会有什么区别呢?

1、对象序列化的作用:

java序列化主要是为了跨平台,实现对象的一致性,可在不同的平台上,保持自己原有的属性和方法不变 。总结来说就是:

1)永久性保存对象,保存对象的字节序列到本地文件中;
2)通过序列化对象在网络中传递对象;
3)通过序列化在进程间传递对象。

2、两者的区别:

java开发者都是知道Serializable的实现机制和作用,有人会问为什么Android又引入Parcelable呢?他们的区别是:

Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

总结就是两者在于存储媒介的不同,Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,优缺点也就很直白了:

1)在使用内存的时候,Parcelable类比Serializable性能高,所以推荐使用Parcelable类。
2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,也不提倡用,但在这种情况下,还是建议你用Serializable 。

3、各自的实现方式:

Serializable很简单

1
2
3
4
5
6
7
8
public class UserSer implements Serializable {
String code;
String message;
String user;
}
//接口
public interface Serializable {
}

Parcelable 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class UserPar implements Parcelable  { //(1)实现Parcelable接口
//(2)添加实体属性
private String code;
private String message;
private String user;

protected UserPar(Parcel in) {
code = in.readString();
message = in.readString();
user = in.readString();
}
//(3)覆写writeToParcel(Parcel dest, int flags)方法,指定写入Parcel类的数据。
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(code);
dest.writeString(message);
dest.writeString(user);
}
// (4)创建Parcelable.Creator静态对象,有两个方法createFromParcel(Parcel in)与newArray(int size),
public static final Creator<UserPar> CREATOR = new Creator<UserPar>() {
//Parcel中读取出数据对象
@Override
public UserPar createFromParcel(Parcel in) {
return new UserPar(in);
}
//创建一个数组
@Override
public UserPar[] newArray(int size) {
return new UserPar[size];
}
};
//(5) 覆写describeContents方法,默认返回0。
@Override
public int describeContents() {
return 0;
}

}

可以看到Parcelable具体的写入(dest.writeInt(mAge);)与读取(gril.mAge = in.readInt();)都是针对Parcel对象进行的操作的

这里写图片描述

进入Parcel你会发现基本上都是都是native方法

这里写图片描述

所以Android中对象序列化是最好使用Parcelable 。