序列化概念
对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。
对象的反序列化:把字节序列恢复为Java对象的过程。
为什么要将对象序列化?
1、永久性保存对象,保存对象的字节序列到本地文件中;
2、用过序列化对象在网络中传递对象;
3、通过序列化对象在进程间传递对象。
serializable
对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可。
private static final long serialVersionUID=0L;
** 案例1: **
1)MySerializable.java
public class MySerializable implements Serializable {...}
2)MainActivity.java
MySerializable mySerializable = new MySerializable ();
Intent intent = new Intent(this,Second.class);
intent.putExtra("mySerializable",mySerializable );
3)Second.java
Intent intent = getIntent();
MySerializable mySerializable = intent.getSerializableExtra("mySerializable");
parcelable
- 实现Parcelable接口
- 添加实体属性
- 覆写writeToParcel(Parcel dest, int flags)方法,指定写入Parcel类的数据。
- 创建Parcelable.Creator静态对象,有两个方法createFromParcel(Parcel in)与newArray(int size),前者指定如何从Parcel中读取出数据对象,后者创建一个数组。
- 覆写describeContents方法,默认返回0。
Parcelable 示例代码:
public class MyParcelable implements Parcelable {
private int mData;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
}
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
private MyParcelable(Parcel in) {
mData = in.readInt();
}
}
存入数据:
Bundle bundle = new Bundle();
bundle.putParcelable("myParcelable", myParcelable );
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtras(bundle);
取出数据:
Intent intent = getIntent();
Bundle bun = intent.getExtras();
MyParcelable myParcelable = bun.getParcelable("myParcelable");
System.out.println(myParcelable );
serializable与parcelable的选择
1、在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable类。
2、Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3、Parcelable不能使用在将数据存储在磁盘上的情况,因为Parcelable不能很好的保存数据的持续性在外界有变化的情况下。因此在这种情况下,建议使用Serializable。
网友评论