[源码]Gson

46 篇文章 0 订阅
40 篇文章 0 订阅

尽量泛化,记录一下Gson大大小小合理的设计和编码方式。


合理设计

  • 一个适用于在同一个对象上做未知但类似的操作,时间上需要协调控制的Command链结构:
    Master:持有被共同修改的对象,用任务队列(异步)/顺序调用(同步)执行所有未知操作
    Slave:从Master获得需要修改的对象,无需上锁(所有调用都是master统一调用的,同一线程),执行操作
    在Android的View结构里面,Master对应着Window/RootViewImpl(持有的共同操作的对象是Canvas)和Choreographer(时序控制),Slave对应着所有的View,注意Slave是不用上锁的,这就是为什么View操作只能在主线程。
    在Gson里面,Master对应着Gson(持有JsonWriter)对象,Slave对应着各种TypeAdapter。
  • 把功能类同数据存储类分开(JSONObject和TypedAdapter),减少对象创建
    如果JSONObject负责toJson,那么每次序列化一个对象,需要创建一个JSONObject,一个数据存储类(writer或者StringBuilder);而如果分开,只需要一个数据存储类和公用的工具类就可以了
  • 把对象和String都当做是一个代填充的画布,JsonElement对应JsonTreeWriter;String对应JsonWriter。这个好diao

优秀编码

  • 如果不需要线程间共享数据(或者重复创建的性能/逻辑问题不大),可用使用ThreadLocal代替synchronized,看样子是可以空间换时间的
  • ConcurrentHashMap比HashTable性能要高很多,但是前者没有全局锁
  • 对于持有很多对象的功能类(Gson),不用单例,而是即用即new,给业务控制权,方便释放内存空间
  • Collections提供了unmodifiableXXX的方法,用来保护不错,相对于OC的immutableXXX
  • getXXX如果可能产生重复递归调用,为了终止递归,可以使用FutureXXX来做占位符,保证只进行一次初始化——Gson.getAdapter
  • 必须要走的逻辑,放到finally里面
  • 对null进行特殊处理:使用默认值代替null;对于必要变量如果是null,直接抛一个异常,减少调用方的判断逻辑
  • 函数传入值如果是可能复用的对象,一定要记得恢复原值
  • 对于树的遍历(JsonWriter遍历对象时)使用状态机维护遍历的状态,可以简化逻辑。使用递归可以时间换简单逻辑——JsonWriter.write相关函数
  • 对于小规模的简单映射(ASCII映射到另一个char)直接用数组比用HashMap空间利用率可能更高——JsonWriter.REPLACEMENT_CHARS
  • 对于简单类型的各种数据结构,性能上考虑可能手工实现会更好些——JsonWriter.stack
  • 为Java原生接口再封装一下,可以增加功能的同时不牺牲通用性——InstanceCreator,跟Class.constructor基本一致,但是增加了序列化反序列化无默认构造函数的类的能力
  • 对于需要反射而又重复调用的Field/Method/Constructor尽量缓存,减少反射次数——ConstructorConstructor.newDefaultConstructor
  • 关键位置用数组替代Collection/StringBuilder/BufferedReader这种对数组的封装,能够提高效率

技巧

  • 运行时获取泛型类的泛型类型,TypeToken。Java泛型需要使用Type而非Class获取,在运行时不能获取本类的泛型情况(只能get到Class),但是可以获取父类的泛型情况(可以get到Type——getGenericSuperClass/getGenericInterfaces)。使用空实现的匿名内部类可以直接进入Type的世界,用Type就都可以拿到泛型的具体类型了
  • JVM中sun.misc.Unsafe类的theUnsafe域有一个功能是为指定类分配一块内存,叫做allocateInstance;Dalvik就用ObjectStreamClass的各种方法试图创建类——UnsafeAllocator
  • 使用Class.cast来进行类型转换也不能避免box/unbox时空指针异常
  • 号称使用局部变量替代成员变量,在大量读取的情况下能够提高整体速度——JsonReader.nextNonWhitespace
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值