Serializable与 Parcelable 的区别

序列化的两种方式,一种是 java 提供的 SerilizableAndroid 自身提供的 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
 public class Person implements Serializable {
//默认方式最好设置为1L,因为 java sdk 会自动进行hash计算,并生成唯一的
//UID值。手动设置serialVersionUID的好处是当前class如果改变了成员变量,
//比如增加或删除之后,这个UID是不改变的,反序列化不会失效。
private static final long serialVersionUID = 1L;
....
}
//Parcable 类似
public class UserInfo implements Parcelable {
private String name;
private String lastName;
...
public static final Creator<UserInfo> CREATOR = new Creator<UserInfo>() {
@Override
public UserInfo createFromParcel(Parcel in) {
return new UserInfo(in);
}

@Override
public UserInfo[] newArray(int size) {
return new UserInfo[size];
}
};
@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(lastName);
}
}

区别

  • 存储媒介的不同
存储媒介 特点
Serializable 使用的IO读写存储在硬盘上,序列化过程使用了反射技术,并且期间产生临时对象(?),从而引起频繁的GC。 代码少
Parcelable 使用的IO读写在内存中,内存的读写速度肯定优于硬盘读写速度,所以Parcelable的性能上优于Serializable. 代码写起来比较多

具体到开发中用哪个,个人觉着要考虑要传递对象的大小,如果对象比较大,手机内存比较小,可能会报出 TransactionTooLargeException: The Binder transaction failed because it was too large . 此时就要考虑使用 Parcelable 了,如果对象不是特别大,使用 Serializable 还是挺合适的,毕竟实现比较简单。

-------------本文结束感谢您的阅读-------------