Parcelable与 Serializable功能对比
1.Parcelable与 Serializable 都可以实现安卓数据的序列化
2.Parcelable 是安卓专用序列化方式,开销比较小,使用麻烦,效率高;Serializable是java序列化方式使用简单需要大量I/O操作,效率低
3.Serializable 序列化可以把数据存储在外存中,保存数据相对于Parcelable放在data 目录下更加持久
4.使用Serializable 需要留意serialVersionUID 当版本对不上的时候,Bean增删改或者包全类名更改,可能造成readObject出错 java.io.InvalidClassException 错误,可参见:https://blog.csdn.net/u011607686/article/details/78933856
建议:安卓尽量使用Parcelable,以减少开销,提高新能,因为大量的I/O操纵会消耗CPU,CPU使用频率过大,会影响MainActivityThread (主线程) 绘制的效率,有可能造成UI卡顿,防微杜渐.如果需要在卸载APP后继续使用本地的数据,就要考虑使用Serializable 或者把数据存储在sqlite中,记得把表建在外存中.
public class SBean implements Serializable {
public String name;
public int age;
public SBean(String name, int age) {
this.name = name;
this.age = age;
}
}
序列化
try {
String fileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/AMI/" + "file.text";
File file = new File(fileName);
SBean sBean = new SBean("李四", 24);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
objectOutputStream.writeObject(sBean);
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
反序列化
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/AMI/" + "file.text"));
SBean sBean = (SBean) objectInputStream.readObject();
objectInputStream.close();
Intent intent = new Intent();
SBean sBean = new SBean("李四", 24);
intent.putExtra("data", sBean);
setIntent(intent);
intent.setClass(this, SecondActivity.class);
startActivity(intent);
SBean data = (SBean) getIntent().getSerializableExtra("data");
public class Bean implements Parcelable {
public String name;
public int age;
public Bean(String name, int age) {
this.name = name;
this.age = age;
}
public Bean(Parcel parcel) {
this.name = parcel.readString();
this.age = parcel.readInt();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeInt(age);
}
// 反序列过程:必须实现arcelable.Creator接口类,类名必须为CREATOR
public static Parcelable.Creator CREATOR = new Creator() {
@Override
public Bean createFromParcel(Parcel parcel) {
//序列化对应的类型
return new Bean(parcel.readString(), parcel.readInt());
}
@Override
public Bean[] newArray(int i) {
return new Bean[i];
}
};
}
方法 | 功能 |
createFromParcel(Parcel parcel) | 从序列化后的对象中创建原始对象 |
newArray(int i) | 创建指定长度的原始对象数组 |
Bean(Parcel parcel) | 从序列化后的对象中创建原始对象 |
writeToParcel(Parcel parcel, int i) | 将当前对象写入序列化结构中,其中i有两种类型:0或1. 1(PARCELABLE_WRITE_RETURN_VALUE)即标识当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况为0 |
describeContents() | 返回当前对象描述,如果含有文件描述返回1(CONTENTS_FILE_DESCRIPTOR),否则返回0 |
Bean bean = new Bean("张三", 23);
Intent intent = new Intent();
intent.setClass(this, SecondActivity.class);
intent.putExtra("data", bean);
startActivity(intent);
Bean bean = getIntent().getParcelableExtra("data");
Parcelable 序列化到本地与反序列化可参见:https://blog.csdn.net/jielundewode/article/details/78342191