项目地址:https://github.com/orhanobut/hawk
一、初探
Hawk是一种安全的、简单的做key、value存储的库。
先来看看Hawk的初始化
|
|
1.1 构造者模式
走进初始化,和大部分lib一样使用了构造者模式做些配置,其中先看看 HawkBuilder.java 所需要构造的变量:
|
|
其实这些变量有些在第一张图上就诠释了,这些都是接口,具体的实现都可以自己定制。
之后我会具体的解释Put和Get操作,其中对整个图的过程以及这些变量会有对应的解释,总之,这几个变量是整个Hawk的核心。
1.2 外观模式
DefaultHawkFacade.java 这个类相当重要,是Hawk真正处理数据操作的,利用建造者模式创建好HawkBuilder然后作为参数传给DefaultHawkFacade。
EmptyHawkFacade.java 这是个空的类,如果没有调用Hawk.build()就用抛出异常 Hawk is not built.Please call build() and wait the initialisation finishes.
二、 put操作
|
|
前面说了,其实是 DefaultHawkFacade 在处理:
|
|
2.1 delete()
删除操作最后落在这 SharedPreferencesStorage.java :
|
|
可以看到,Hawk最后存储的方式其实还是用的SharedPreferences。
2.2 converter.toString()
转换操作在 HawkConverter.java 里:
|
|
parser是个什么鬼?来看看 GsonParser.java :
|
|
原来Hawk是直接将存储的value通过gson反序列化成String。
2.3 encryption.encrypt()
加密操作在 ConcealEncryption.java 里:
|
|
Crypto 是facebook开源的高效加密验证方案conceal,Hawk将之前反序列化生成的文本经过conceal加密后再Base64一下返回加密后的文本。
2.4 串行操作
做这一步是为了解决泛型擦除后,想通过gson反序列化回原来的类型对象,那么这里就会通过自己的手段记录一下类型。
相关操作在 HawkSerializer.java 里:
|
|
可以看到,Hawk对value的类型在这里做了记录,以便之后反序列化时用到。
三、get操作
因为put和get是相对的,所以理解put后去看get那就是相当容易了。
|
|
具体操作还是在 DefaultHawkFacade :
|
|
3.1 解析串行文本
还是 HawkSerializer.java :
|
|
再来看看DataInfo对象:
|
|
总之,这一步就是把之前put时拼接存的信息又都解析出来了。
3.2 反序列化为原对象
3.1中所做的又都是为这一步做铺垫,这里是想拿到正确结果至关重要的一步,来看 HawkConverter.java
|
|
以List为例,看看toList(value, keyType)做了啥:
|
|
尾语
Hawk的代码写的很干净,流程中任何步骤都可以被开发人员定制,比如你如果觉得gson太慢,可以换成别的。