今天在项目中要跨进程传递数据,发现以前编写项目的开发人员用的是Serializable。本来我也打算用的。但是一想到这不用存在本地磁盘中,就想到了性能问题,想到了一个好久没用的东西,没错就是Parcelable,废话不多说直接进入主题。
我们知道实现Parcelable是为了进行序列化,那么为什么要序列化,什么是序列化呢?
1.首先,我们先简单的理解下,什么是序列化。简单来说就是为了保存在内存中的各种对象状态,也就是实例变量,并且可以把保存的对象状态重新读取出来。
2.为什么要序列化呢!序列化:
一:永久性保存对象,保存对象的字节顺序到本地。
二:通过序列化对象在网络中传递数据。
三:通过序列化在进程之间进行传递数据。
那么我们在Android中实现序列化的方法有两种:一是实现Serializable接口,一是实现Parcelable接口。在Android中Parcelable的效率比Serializable接口高效,可用于Intent数据传递,也可用于进程之间的通信。但是实现Parcelable的接口被Serializable的方法要复杂一些。但是并不是所有的都使用Parcelable接口,那么我们怎样抉择是否使用Parcelable接口呢!
1.在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况,尽管Serializable效率低点,但此时还是建议使用Serializable.
4.在android进程和服务中,简单的数据就不必序列化了,直接通过Intent传递就好。
那Parcelable的实现步骤是怎样得呢?
1.首先实现Parcelable接口 implements Parcelable
2.重写writeToParcel方法,将你的对象序列化为一个Parcel对象,也就是:将类的数据写入外部提供的Parcel中,打包需要传递的数据到Parcel容器保存,以便于从Parcel容器获取数据。
3.重写describeContents方法,内容接口描述,一般默认返回0就行。
4.实例化静态内部对象CREATOR实现接口Parcelable.Creator (注意:这里一定要设置成静态的,如果不是静态的在运行的时候回出现Parcelable解析错误,内部对象CREATOR的名称不可以改变,必须全部大写)。
这种注意的就是:其中public static final一个都不能少,内部的CREATOR的名称也不能改变,必须全部大写。需重写本接口中的两个方法:createFromParcel(Parcel in)实现从Parcel容器中读取传递的数据值,封装成Parcelable对象返回逻辑层,newArray(int size)创建一个类型为T,长度为size的数组,return new T[size],供外部类发序列化本数组使用。
简单实现代码如下:
import android.os.Parcel;
import android.os.Parcelable;
public class TestParceable implements Parcelable {
private int age;
private String sex;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private TestParceable(Parcel source) {
age = source.readInt();
sex = source.readString();
name = source.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(age);
dest.writeString(sex);
dest.writeString(name);
}
public Creator<TestParceable> getCREATOR() {
return CREATOR;
}
public static final Parcelable.Creator<TestParceable> CREATOR = new Parcelable.Creator<TestParceable>() {
@Override
public TestParceable[] newArray(int size) {
return new TestParceable[size];
}
@Override
public TestParceable createFromParcel(Parcel source) {
return new TestParceable(source);
}
};
}