1、概述
本篇的主题是关于Android数据的缓存和序列化。对于复杂的数据,需要使用数据库存储,但相对简单并且不需要复杂查询等操作的数据,通常会使用缓存的方式进行存取。缓存的方式主要有Sharedpreference、序列化、本地文件三种。
Android数据缓存的基本方式:
- 1、Sharedpreference
- 2、序列化
- Serializable
- Parcelable
- 3、本地文件
- 普通字符串
- Json字符串
2、数据缓存的场景和技术选型
2.1简单数据存取
存取简单数据,用Google官方提供的Sharedpreference是再合适不过的选择,SP支持基本类型数据的存放。
但需要注意的是一定不要使用Sharedpreference存放复杂的数据,具体有何弊端,请参考这篇文章《谈一谈SharedPreference的一些使用误区》
2.2 复杂数据存取
2.2.1 Serializable 方式
2.2.3 写入本地文件方式
- 普通字符串方式写入
- 常规方式写入
普通字符串,不需要特殊处理的字符串,直接写入本地文件。 - Base64编码后 写入
对于一些特殊数据,为达到防止格式改变等目的可以采用Base64编码后写入本地文件,关于Base64编码可参考这篇文章Base64编码原理与应用。
- 常规方式写入
- 对象转为Json字符串存取
对于复杂的对象,希望比较方便地从本地文件中恢复回来又不想维护复杂的版本控制逻辑,那将对象转为Json字符串,存入本地文件是个不错的选择,但是这种方式也要注意,缓存的数据对象最好不要有字段重命名,可以加字段,效果是从老版本缓存数据反序列化回来的新字段会为默认值,这倒影响不大,最忌讳的是更改要缓存对象的字段属性,比如 字段 content 原来为 String 缓存到本地后,content的属性被改变为List<String> ,这种情况 如果使用Gson等自动解析工具进行反序列化就会报类型不匹配异常而失败。
2.3 Intent 传递复杂数据
2.3.1 Serializable 方式
相对简单,类及其内部的成员都实现Serializable接口即可,不需要额外的代码,但性能和速度上较慢。
参考这篇文章:Parcelable vs Serializable。
2.3.2 Parcelable 方式
速度较Serializable快10倍以上,但实现起来较复杂,关于Parcelable的使用请参考这篇文章:Android序列化完全解析(二)-Parcelable
但这也只是流传的主流看法,这篇文章Android序列化完全解析(三)-拨乱反正,堪比窦娥的Serializable的作者就提出了不同观点。当然,这作者是在Serializable的使用方式上做出了一些改变后,得出的结果,不予置评,具体可以根据自己的喜好选择。
关于简化Parcelable的使用,降低使用成本请参考这篇文章Android中传递对象的三种方法的“简化Parcel操作部分”,作者列举了一系列简化Parcelable的工具和第三方库。
2.3.2 将对象转为Json字符串传递
将对象转为Json字符串,以字符串的方式传递,接收后再反序列化。
这种可能是最简单的一种方式,但根据这篇文章Android中传递对象的三种方法的测试结果,这种方式也是效率最低的一个。
参考文章:
本文中提到的文章都是可以点击的文章链接,在此一并谢过作者了。下列文章,也是本文的参考文章。
Android中传递对象的三种方法
Intent 数据传递 总结
4.5.2 Intent之复杂数据的传递
Parcelable vs Serializable
其他精彩文章推荐:
Android网络请求发展简史和RxJava+Retrofit+OkHttp实践
Android BaseAdapter的极简封装