ProtoBuf序列化支持的语言种类多,在众多的序列化工具对比中性能上也具有非常大的优势,主要体现在以下三个方面体现:
- 用标识符来识别字段:我们知道JSON这种key-value 的数据格式增加了很多额外的字符,比如“r”等。在前面的proto文件示例中可以看到stringname-1这样的定义,后面的“1”并不是初始值,而是该属性的标识符,ProtoBuf就是用该标识符代替了属性的定义,它被用来在消息的二进制格式中识别各个字段,所以这里的标识符必须是唯一的。序列化时会将该编号及该属性的值一起转化为二进制数据,反序列化时通过标识符就知道该value是哪个属性的。这样做的好处是序列化后的数据大大减小了。
- 自定义可变数据类型 Varint 用来存储整数:这个优化和 Kryo的优化有些类似。it整数类型在计算机中占用4 字节,但是绝大部分的整数都是比较小的整数,实际用不了4字节比如100在计算机中的二进制值的前24位都是0只要用1字节就可以存储ProtoBuf中定义了 Varit这种数据类型,可以以不同的长度来存储整数,将数据进-步进行了压缩,减少了序列化的数据大小。
- 记录字符串长度,解析时直接截取:上面讲到用标识符来表示字段,后面紧跟着数据,这样可以直接解析数据。如果是字符串类型,则不能直接解析。所以 ProtoBuf在真实数据前还添加了该字符串的长度,也用 Varint 类型表示。这种策略可以保证反序列化时直接通过字符串长度来截取后面的真实数据 value。