Android_序列化

​ 首先需要解释下什么是序列化: 即将对象转为可存储的状态

Android开发中需要在不同的组件之间实现数据交互, 而关联各个组件的就是Intent: 意图, 意图可以传递基本数据类型, 但是如果想要进行对象传递, 就需要将对象先进行序列化. 并且被序列化的对象可以进行数据传输和进程通讯.

实现方式

对象序列化的方式有两种:

  1. 实现Serializable接口
  2. 实现Parcelable接口

两种方式的区别:

  • Serializable

    这是Java自带的接口, 是通过反射的方式进行序列化操作, 所以会容易触发垃圾回收

  • Parcelable

    这是Android增加的接口, 和Serializable不同的是他的实现原理是将对象进行分解. 意图支持基本类型, 所以就将对象的成员拆解成基本类型进行存储.

    Parcelable相对于Serializable速度更快, 不需要用到反射

具体实现

Serializable

这是一个标记接口, 需要序列化对的对象实现该接口即可, JDK会自动将其序列化

Parcelable

该接口不仅需要实现, 还需要写模板代码<即固定写法的代码>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class Data implements Parcelable {
// 这是我自己随便定义的成员变量
private String name;
private int age;
// 以下方法为读取序列化部分
protected Data(Parcel in) {
// 这里需要我们手动执行read方法读取成员变量
in.readString();
in.readInt();
}
public static final Creator<Data> CREATOR = new Creator<Data>() {
@Override
public Data createFromParcel(Parcel in) {
return new Data(in);
}
@Override
public Data[] newArray(int size) {
return new Data[size];
}
};
// 以下方法为写入序列化部分
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// 这里需要我们手动执行write方法写入成员变量
dest.writeString(name);
dest.writeInt(age);
}
}

BundleIntent都支持对Serializable和Parcelable的直接存取操作. Intent还支持存储Bundle.

最后我想说开发中优先选择实现Parcelable, 因为其效率比Serializable快几倍, 能增加效率为何不增加呢?

如果你觉得Parcelable创建还是麻烦, 可以按照Android Stduio 插件一键实现Parcelable接口

然后生成代码

注意:

  1. 在序列化对象中写入的顺序和读取的顺序必须一样
  2. 没有进行写入读取操作的成员变量无法得到其值
  3. 成员方法不需要进行读写同样可以传递过去直接调用, 但是成员方法里面如果调用了成员变量, 成员变量并没有进行读写那依旧无法使用.