Android 对象序列化方式
文章目录
【注意】最后更新于 April 1, 2018,文中内容可能已过时,请谨慎使用。
Android
内序列化对象主要有两种方式, 一是原Java
自带的Serializable
接口, 二是Android
内自有的Parcelable
接口
1. Serializable
接口
Java
自带的序列接口使用非常简单, 只要实现Serializable
接口即可. Serializable
接口只是一个标志类, 系统会将实现了这个接口的类自动进行序列化.
如果想自定义序列化/反序列化过程, 可以自主实现
writeObject()
和readObject()
. 一般我们都不会这么做的
还可以定义一个long serialVersionUID
来检测反序列时的数据. 如果值不一样, 反序列时出抛出错误. 这个值可以使用Android Studio
自动生成, 也可以手工指定一个. 数值不论如何, 其本质是一样的.
实现Serializable
的类成员也一定是可以Serializable
的, 比如基本类型int
, long
, 字符类型String
, 或者实现了Serializable
接口的自定义类.
可以使用关键字transient
来标明不参与序列化过程的变量
|
|
2. Parcelable
接口
由Parcelable
序列化的类可以自由在Binder
中进行传输. 但实现的过程会比Serializable
麻烦些. 但是Serializable
在序列化和反序列化时需要大量的I/O
操作, 效率会比较低. 在Android
中推荐使用Parcelable
, 其在内存中序列化后可以立马发送到网络中, 或者保存到设备上. 如果数据较小也可以使用Serializable
来实现, 其优点是方便简单
可Parcelable
类里内的变量需要是基本类型或者是可序列化的对象. Intent
, Bundle
, Bitmap
都实现了Parcelable
接口. List
, Map
如果其内的每个元素是可序列化的话, 那么这两个也是可序列化的.
实现Parcelable
要实现几个方法和变量:
writeToParcel(Parcel out, int flag)
方法的实现表示类是如何创建序列化对象和数组的. 注意这个实现是的顺序, 当反序列化时也需要按这个顺序来写flags
的值一般为0
或1
(即PARCELABLE_WRITE_RETURN_VALUE
), 当为1
时表示当前对象需要作为返回值返回, 不能立即释放资源. 通常一般这个值都为0
describeContents()
方法的返回值一般为0
, 当序列化内容含有文件描述符时, 返回1
(即CONTENTS_FILE_DESCRIPTOR
)- 定义一个
static final
的常量CREATOR
来实现反序列化操作. 这个常量实现了Parcelable.Creator
接口.T createFromParcel(Parcel in)
方法表明如何反序列化一个类. 反序列化的顺序要和序列化时一样T[] newArray(int size)
方法表明如何反序列化出一个类的对象数组
|
|