1.序列化的目的
(1).永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中
(2).通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的.因此序列化的目的是将对象数据转换成字节流的形式)
(3).将对象数据在进程之间进行传递(Activity之间传递对象数据时,需要在当前的Activity中对对象数据进行序列化操作.在另一个Activity中需要进行反序列化操作讲数据取出)
(4).Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长(即每个对象都在JVM中)但在现实应用中,就可能要停止JVM运行,但有要保存某些指定的对象,并在将来重新读取被保存的对象。这是Java对象序列化就能够实现该功能。(可选择入数据库、或文件的形式保存)
(5).序列化对象的时候只是针对变量进行序列化,不针对方法进行序列化.
(6).在Intent之间,基本的数据类型直接进行相关传递即可,但是一旦数据类型比较复杂的时候,就需要进行序列化操作了.
使用Pacelable接口,重写Parcelable接口中的两个方法和静态变CREATOR
public class MyClass implements android.os.Parcelable {
private String a = null;
private int b = 0;
private MyClassA myClassA = new MyClassA;
private List<MyClassB> myClassB = new ArrayList<MyClassB>();
public MyClass(Parcel parcel) {
// 按变量定义的顺序读取
a = parcel.readString();
b = parcel.readInt();
myClassA = parcel.readParcelable(MyClassA.class.getClassLoader());
Parcelable[] pars = parcel.readParcelableArray(MyClassB.class.getClassLoader());
myClassB = Arrays.asList(Arrays.asList(pars).toArray(new MyClassB[pars.length]));
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// 按变量定义的顺序写入
dest.writeString(a);
dest.writeString(b);
dest.writeParcelable(myClassA, flags);
dest.writeParcelableArray((myClassB.toArray(new MyClassB[myClassB.size()])), flags);
}
public static final Parcelable.Creator<MyClass> CREATOR = new Parcelable.Creator<MyClass>() {
@Override
public Param createFromParcel(Parcel source) {
return new MyClass(source);
}
@Override
public MyClass[] newArray(int size) {
return new MyClass[size];
}
};
}
使用Serializable接口,定义序列化ID自定义类MyClassMyClassAMyClassB
示例:
MyClass:
public class MyClass implements java.io.Serializable {
private static final long serialVersionUID = 1L; // 定义序列化ID
private String a = null;
private int b = 0;
private MyClassA myClassA = new MyClassA;
private List<MyClassB> myClassB = new ArrayList<MyClassB>();
}
MyClassA、MyClassB实现方法同上。
TestActivity.java:
MyClass myClass = new MyClass("a", "b", new MyClassA(), new ArrayList<MyClassB>());
Intent intent = new Intent(this, SerializableActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("key", myClass);
intent.putExtras(bundle);
startActivity(intent);
总结:
.Parcelable与Serializable的性能比较
首先Parcelable的性能要强于Serializable的原因我需要简单的阐述一下
1). 在内存的使用中,前者在性能方面要强于后者
2). 后者在序列化操作的时候会产生大量的临时变量,(原因是使用了反射机制)从而导致GC的频繁调用,因此在性能上会稍微逊色
3). Parcelable是以Ibinder作为信息载体的.在内存上的开销比较小,因此在内存之间进行数据传递的时候,Android推荐使用Parcelable,既然是内存方面比价有优势,那么自然就要优先选择.
4). 在读写数据的时候,Parcelable是在内存中直接进行读写,而Serializable是通过使用IO流的形式将数据读写入在硬盘上.
但是:虽然Parcelable的性能要强于Serializable,但是仍然有特殊的情况需要使用Serializable,而不去使用Parcelable,因为Parcelable无法将数据进行持久化,因此在将数据保存在磁盘的时候,仍然需要使用后者,因为前者无法很好的将数据进行持久化.(原因是在不同的Android版本当中,Parcelable可能会不同,因此数据的持久化方面仍然是使用Serializable)
热点新闻