将特定结构的数据转化为一种能被记录和还原的格式即存储java
数据存储的六个关键因素:正确性、时间开销、空间开销、安全、开发成本和兼容性。咱们不可能同时把全部要素都作到最好,所谓数据存储优化就是根据本身的使用场景去把其中的一项或者几项作到最好。数组
更宽泛的讲,存储不必定就是将数据存放在磁盘中,好比放到内存中、经过网络传输也算是存储的一种形式。或者咱们也能够把这个过程叫作对象或者数据的序列化。安全
对于大部分的开发者来讲,咱们不必定有精力去创造一种数据序列化的格式,Android经常使用的序列化方法如何进行选择。网络
对象的序列化函数
应用程序中的对象存储在内存中,若是咱们想把对象存储下来或者在网络上传输,这个时候就须要用到对象的序列化和反序列化。性能
对象序列化就是把一个Object对象全部的信息都表示成一个字节序列,包括Class信息、继承关系信息、访问权限、变量类型以及数值信息等。优化
1.Serializable编码
Serializable是java原生的序列化机制,在Android中也有被普遍使用,咱们能够经过Serializable将对象持久化存储,也可经过Bundle传递Serializable序列化数据。加密
Serializable的原理设计
Serializable原理是经过ObjectInputStream和ObjectOutputStream来实现的,咱们以Android6.0源码为例,部分ObjectOutputStream的源码实现
整个序列化过程使用了大量的反射和临时变量,并且在序列化对象的时候,不只会序列化当前对象自己,还须要递归序列化对象引用的其余对象
整个过程计算很是复杂,并且由于存在大量反射和GC的影响,序列化的性能会比较差。另一方面由于序列化文件须要包含的信息很是多,致使它的大小比Class文件自己还要大不少,这样会致使I/O读写的性能问题。
Serializable的进阶
既然Serializable性能那么差,那它有什么优点吗
一、writeObject和readObject方法。Serializable序列化支持替代默认流程,它会先反射判断是否存在咱们事先的序列化方法writeObject或反序列化方法readObject,经过这两个方法,咱们能够对某些字段作一些特殊修改,也能够实现序列化的加密功能。
2.writeReplace和readResolve方法。这两个方法代理序列化的对象,能够实现自定义返回的序列化实例。咱们能够经过它们实现对象序列化的版本兼容,例如经过readResolve方法能够把老版本的序列化对象转换成新版本的对象类型。
Serializable的序列化与反序列化调用流程以下
Serializable的注意事项
Serializable虽然使用很是简单,可是也有必定须要注意的事项选段
1.不被序列化字段。类的static变量以及被声明为transient的字段,默认的序列化机制都会忽略该字段,不会进行序列化存储。
2.SerialVersionUID 在类实现Serializable接口后,咱们须要添加一个SerialVersionID,它至关于类的版本号,这个ID咱们能够显式声明也可让编译器本身计算。一般我建议显示声明会更加稳妥,由于显式声明假如类发生一点点变化,进行反序列化都会因为serialVersionUID改变而致使InvalidClassException异常
3.构造方法。Serializable的反序列默认是不会执行构造函数的,它是根据数据流中对Object的描述信息建立对象的,若是一些逻辑依赖构造函数,就可能出现问题,例如一个静态变量只在构造函数中赋值,固然咱们也能够经过进阶方法作自定义的反序列化修改
Parcelable
因为Java的Serializable的性能较低,Android须要从新设计一套更加轻量且高效的对象序列化和反序列化机制,Parcelable正是在这个背景下产生的,它核心的做用就是为了解决Android中跨进程通讯的性能问题。
Parcelable只会在内存中进行序列化操做,并不会将数据存储在磁盘里
固然能够经过marshall接口获取byte数组,而后存在文件中从而实现Parcelable的永久存储。
Parcelable的注意事项
在时间开销和使用成本的权衡上,Parcelable机制选择的是性能优先
因此它在写入和读取的时候都须要手动添加自定义代码,使用起来相比Serializable会复杂不少,可是正由于这样,Parcelable才不须要采起反射的方式去实现序列化和反序列化。
虽然能够经过取巧的方法实现Parcelable的永久存储,可是它存在两个问题
1.系统版本的兼容性。因为Parcelable设计本意是在内存中使用,咱们没法保证Android版本Parcel.cpp实现都彻底一致,若是不一样版本实现有所差别,或者有厂商修改了实现,可能存在问题
2.数据先后兼容性。Parcelablel并无版本管理的设计,若是咱们类的版本出现升级,写入的顺序以及字段类型的兼容都须要格外注意,这也带来了很大的维护成本
通常来讲,若是须要持久化存储的话,通常仍是不得不选择性能更差的Serializable方案
Serial
三方性能更优
数据的序列化
对象的序列化要记录的信息仍是比较多,在操做比较频繁的时候,对应用的影响仍是很多的,这个时候咱们能够选择使用数据的序列化
1.JSON
JSON是一种轻量级的数据交互格式,它被普遍使用在网络传输中,不少应用于服务端的通讯都是使用JSON格式进行交互
优点
1.相比对象序列化方案,速度更快,体积更小
2.相比二进制的序列化方案,结果可读,易于排查问题
3.使用方便、支持跨平台、跨语言、支持嵌套引用
2.Protocal Buffers
相比对象序列化方案,JSON的速度更快、体积更小,不过为了保证JSON的中间结果是可读的,它并无作二进制的压缩,也所以JSON的性能尚未达到极致。
若是应用的数据量很是大,又或者对性能有更高的要求,此时Protocal Buffers是一个很是好的选择,它是Google开源的跨语言编码协议,Google内部的几乎全部RPC都在使用这个协议
存储监控
随后补上