数据序列化的作用
可实现进程间通信,本地数据存储,网络数据传输等都需要实现序列化,但是由于应用场景不同,序列化的方式也不同,因为要考虑效率和使用难易的问题。序列化的目的其实简单来说就是想实现数据的传输。
序列化与反序列化
序列化:将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
反序列化:即序列化的反向操作,将磁盘中的数据转化成对象,方便以后使用。
Serializable
一、Serializable简介
Serializable是一个可传递的容器,是使用最广泛也是最简单的一种,只需要实现其接口即可实现数据序列化,但是Serializable也有缺点,它使用到反射机制,在序列化的创建过程中会创建很多临时对象,容易触发垃圾回收,序列化过程慢,如果对效率要求严格则不建议使用。Serializable是JDK提供的接口,这种序列化方式是基于磁盘或网络的。
二、使用方法
public class SerializableDemo implements Serializable{
public int age;
public String name;
public String sex;
}
Parcelable
一、简介
Parcel就是一个存放读取数据的容器, android系统中的binder进程间通信(IPC)就使用了Parcel类来进行客户端与服务端数据的交互,而且AIDL的数据也是通过Parcel来交互的。在Java空间和C++都实现了Parcel,由于它在C/C++中,直接使用了内存来读取数据,因此,它更有效率。Parcelable是Android的SDK提供的接口,它是基于内存的,由于内存读写速度高于磁盘,因此Android跨进程对象的传递一般使用Parcelable。
二、使用方法
Parcelable的使用较为复杂,因为需要重写很多方法,但是Android Studio提供了一个插件Android Parcelable code generator,它可以帮我们自动实现Parcelable需要重写的方法。
Android Parcelable code generator 安装方法
使用Android Parcelable code generator实现Parcelable序列化
(1)编写需要序列化的类
public class ParcelableDemo{
public int age;
public String name;
public String sex;
}
(2)使用Android Parcelable code generator工具
(3)自动生成的代码
public class ParcelableDemo implements Parcelable {
public int age;
public String name;
public String sex;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.age);
dest.writeString(this.name);
dest.writeString(this.sex);
}
public ParcelableDemo() {
}
protected ParcelableDemo(Parcel in) {
this.age = in.readInt();
this.name = in.readString();
this.sex = in.readString();
}
public static final Parcelable.Creator<ParcelableDemo> CREATOR = new Parcelable.Creator<ParcelableDemo>() {
@Override
public ParcelableDemo createFromParcel(Parcel source) {
return new ParcelableDemo(source);
}
@Override
public ParcelableDemo[] newArray(int size) {
return new ParcelableDemo[size];
}
};
}
实现Parcelable需要实现的方法:
- describeContents:接口内容的描述,一般返回0即可
- writeToParcel:序列化的方法,将类的数据写入到Parcel容器中
- 静态的Parcelable.Creator接口,这个接口包含两个方法:(1)createFromParcel:反序列化的方法,将Parcel还原为java对象。(2)newArray:提供给外部类反序列化这个数组使用。
JSON
JSON全称JavaScript Object Notation,它是一种轻量级的数据交换格式,Android SDK原生支持JSON格式的解析和序列化,JSON可以说是移动端使用最广泛的数据交换格式。对于JSON的解析,google还推出了自己的开源库Gson可以很快的实现JSON的解析。
写在末尾
序列化的方式远不止这么多,但是这三种方式是目前Android实现序列化应用最广泛的方法,它们各有各的优点,Serializable使用简便,Parcelable效率高,JSON应用广泛。虽然Parcelable的效率高于Serializable,但是Parcelable不能使数据长期保存于磁盘中,所以在某种情况下我们依然会使用Serializable来实现序列化。