本文主要是介绍Parcelable与 Serializable,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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中,记得把表建在外存中.
1.Serializable 使用
java Bean:
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");
2.Parcelable 使用
java Bean:
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();}@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel parcel, int i) {parcel.writeString(name);parcel.writeInt(age);}// 反序列过程:必须实现arcelable.Creator接口类,类名必须为CREATORpublic static Parcelable.Creator<Bean> CREATOR = new Creator<Bean>() {@Overridepublic Bean createFromParcel(Parcel parcel) {//序列化对应的类型return new Bean(parcel.readString(), parcel.readInt());}@Overridepublic 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
这篇关于Parcelable与 Serializable的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!