Android开发之序列化那点事
目录
一、前言
- 序列化是什么东东呢?
- 序列化有什么用呢?
- 为什么要序列化呢?
- 如何序列化呢?
二、序列化的理解
- 序列化是将对象的状态信息转换为可以存储或者传输的形式的过程。
- 有序列化,当然也就有反序列化
序列化:把对象转换为字节序列的过程称为序列化 反序列化:把字节序列恢复为对象的过程称为对象的反序列化
- 序列化与反序列化的使用场景更多的是在:1、进程间通信 2、网络通信 3、对象存储
- 当然,我们在进行Android开发是,遇到进程间通信时就需要进行序列化了。如你想通过Intent传递对象时,对象必须实现序列化接口。
三、Android中如何让对象获得序列化能力?
1、Serializable接口
- Serializable是Java所提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。
- 使用Serializable是相当简单的,我们只需要让类实现序列化接口并在类的声明中指定serialVersionUID即可自动实现序列化过程。
- 可能大多是情况下我们都忽略了声明一个serialVersionUID,虽然不指定serialVersionUID也可以实现序列化过程,其实此时系统内部是根据当前类的成员变量等信息自动生成一个serialVersionUID。此时的serialVersionUID会因为类的修改而发生变化,这样会产生什么影响呢?
- 要想知道会产生什么影响,我们应该先了解serialVersionUID在序列化和反序列化过程中的作用,当你理解知道,自然而然就会明白由此带来的影响的
serialVersionUID的作用
- 在序列化的时候,系统会把当前类的serialVersionUID写入序列化文件中,在反序列化的时候,系统会去检测文件中的serialVersionUID是否与当前类的serialVersionUID一致,如果一致,说明序列化的类的版本和当前类的版本是一致的,如果serialVersionUID不一致,说明类被修改了,此时反序列化是失败的。
- 假如我们只是类中新增了字段,我们还是希望反序列化能成功,那么此时我们应该如何处理的。
- 很简单,我们只需要手动指定一个serialVersionUID即可。但是如果是类名发生了变化,或者原来字段的类型,此时还是会序列化失败的哦。
2、Parcelable接口
-
Parcelable接口是Android SDK提供的一种专门用于Android应用中对象的序列化和反序列化的方式,相比于Seriablizable具有更好的性能。实现Parcelable接口的对象就可以实现序列化并可以通过Intent和Binder传递。
-
以下是使用Parcelable接口需要接触到的一些api
方法 | 功能 | 标记位 |
---|---|---|
createFromParcel(Parcel in) | 从序列化后的对象中创建原始对象 | |
newArray(int size) | 创建指定长度的原始对象数组 | |
User(Parcel in) | 从序列化后的对象中创建原始对象 | |
writeToParcel(Parcel out,int flags) | 将当前对象写入序列化结构中 | PARCALABLE_WRITE_RETURN_VALUE |
describeContents | 返回当前对象的内容描述,几乎所有情况都返回0,仅在当前对象中存在文件描述符时返回1 | CONTENTS_FILE_DESCRIPTOR |
- 既然Parcelable和Serializable都可以实现序列化并且可以用于Intent间的数据传递,那么两者有什么区别呢?
区别 | Serializable | Parcelable |
---|---|---|
所属API | JAVA API | Android SDK API |
原理 | 序列化和反序列化过程需要大量的I/O操作 | 序列化和反序列化过程不需要大量的I/O操作 |
开销 | 开销大 | 开销小 |
效率 | 低 | 很高 |
使用场景 | 序列化到本地或者通过网络传输 | 内存序列化 |