Serializable 和Parcelable
2018-06-22 本文已影响33人
feifei_fly
Serializable
Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。
- Serializable 是java自带的,Parcelable 是Android特有的
- Serializable 使用了反射,序列化的过程较慢,并且在序列化时 会产生大量的临时变量,有可能引发频繁的GC。这是Serializable的缺点。
实现 Serializable 只需要声明实现Serializable接口,并声明一个serialVersionUID。
public class Person implements Serializable{
private static final long serialVersionUID = 7382351359868556980L;
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Parcelable
Parcelable 是Android中所特有的,也可以实现在网络上进行传输,也可以存储到本地的功能。
- 不过不同于将对象进行序列化,Parcelable是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,从而实现传递对象的功能。在效率上Parcelable要比Serializable 快10倍以上。
- 针对android的不同版本,Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。
实现Parcelable接口需要
(1)复写describeContents方法和writeToParcel方法
(2)实例化静态内部对象CREATOR,实现接口Parcelable.Creator。
(3)writeToParcel写的顺序和CREATOR中读的顺序必须一致。
public class Pen implements Parcelable{
private String color;
private int size;
protected Pen(Parcel in) {
color = in.readString();
size = in.readInt();
}
public static final Creator<Pen> CREATOR = new Creator<Pen>() {
@Override
public Pen createFromParcel(Parcel in) {
return new Pen(in);
}
@Override
public Pen[] newArray(int size) {
return new Pen[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(color);
dest.writeInt(size);
}
}
作者:阿敏其人
链接:https://www.jianshu.com/p/a60b609ec7e7
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
应用场景:
- 如果是保存或网络传输数据,尽管Serializable效率低点,但是还是推荐使用Serializable。
- 如果是在内存中数据传输时推荐使用Parcelable,如activity间传输数据,AIDL进程间通信传递数据。因为Parcelable内存操作效率比较高。