旧机宝开发笔记之:protobuf(PB)、GSON、JSON的选用

之前的项目大多使用GSON,理由是序列化和反序列化非常方便,又是使用广泛的多平台JSON格式,尤其为第三方应用提供aidl接口的时候,如果有些数据不方便传递给第三方,而平台又一股脑的用经典的JSON格式都返回了(有些字段只有应用内部才需要用到),此时通过序列化和反序列化对JSON数据的过滤筛选有奇效。当然这些都考虑到了开发的便利性,用亲儿子GSON而不用其他的fastjson等则是考虑到兼容性。不过谷歌又生了个儿子叫protobuf,据说在序列化和反序列化上有非凡的造诣:
Why not just use XML?
Protocol buffers have many advantages over XML for serializing structured data. Protocol buffers:

  • are simpler
  • are 3 to 10 times smaller
  • are 20 to 100 times faster
  • are less ambiguous
  • generate data access classes that are easier to use programmatically
    来源:谷歌开发者网站
    因而想起来比较一下常用的GSON,原生的JSON,以及新儿子protocol buffers
    当然这里有一点必须指出,这里多次测试都是使用特定的生产报文进行的,之后条目不变,内容相差不大。另外因为发送网络请求的时候,都会转化为byte数组,所以序列化的标志是生成byte数组,反序列化的标志则是从byte数组生成对象并取出一个二级值。得出结论如下:

结论:不考虑服务端的情况下,性能较差的设备建议使用JSON,性能较强的设备建议使用PB。
整体上(序列化和反序列化综合考虑),当性能足够强的时候(如当前的主流旗舰手机),PB具有极致的性能表现,其相比JSON速度快了五倍,相比GSON则快了一个数量级,随着设备性能逐渐下降,JSON的表现会更加突出,逐渐缩小和PB之间的性能差距,当性能降低到新大陆X5和联迪C10时,JSON的性能已经反超PB,快三倍左右,在这样的情况下PB的性能甚至不如GSON;
对于PB而言,当性能足够强的时候,其序列化和反序列化差距很小,随着设备性能的降低,PB的序列化会变得吃力,反序列化则依然非常快速,当性能降低到联迪C10等级别时,序列化的速度已经和反序列化的速度差了两个数量级,大约有四五十倍的区别。同样的,单从反序列化来看,无论设备性能如何,PB大部分时间都比JSON和GSON有数量级上的优势。
对于JSON而言,无论性能如何,其序列化和反序列化的速度都非常接近。其反序列化一直不如PB,但是其序列化可以在性能差的机器上占据数量级优势,比PB和GSON都快三倍左右。
对于GSON,其序列化和反序列的性能稳定接近,当设备性能足够强的时候,其序列化和反序列化比JSON慢三倍左右,和PB则有着数量级上的差距,但是随着设备性能的降低,PB序列化会逐渐吃力,直到最后GSON的序列化会和PB达到同一水平并稳定占据一些优势。总体上GSON没有亮点。
另外对于报文大小,当报文条目结构一定时, PB相对JSON压缩60%左右。

旧机宝常常处于这样的状态:旧手机接受新手机发送过来的指令,大部分情况下,性能较差的旧手机要实现新手机发送过来的指令的反序列化,而性能较强的新手机作为控制者,常常需要实现指令的序列化。这样可以把protobuf在性能差设备上的反序列化优势和性能强设备上的序列化优势全都发挥出来,简直不能更适合了,再加上需求记录的需要,旧机宝决定采用protobuf作为报文序列化和反序列化工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值