
JS
Protobuf具备诸多优点:其一,采用二进制格式编码,其中variant int格式表现得尤为出色。例如,即便对于8字节的int64类型,只要数值足够小,编码之后最终仅需1字节。其二,自带领域特定语言(DSL,即proto文件)。在定义message时需要标注tag,这就意味着无需像
JSon那样对字段名称进行编码,只需编码tag数字即可,从而削减了序列化的数据量。其三,具备代码生成功能,针对每个结构都会生成相应的序列化与反序列化方法。对于
Java、C这类语言而言,如果没有代码生成,就只能借助反射,而反射的速度明显较慢。若线上服务存在序列化耗时过高的问题,最终可能也会走上代码生成这条路。Protobuf是为网络传输优化设计的,与静态类型语言搭配使用效果更佳,若不是这种场景,就很难体会到它的优势。例如,在动态语言中,显然
JSon更为适用,特别是在
JS里,一个
JSON.stringify就能搞定的事情,就没必要再编写proto文件,然后编译成对应的
JS源码来执行了。并且类似
JSon的二进制格式(如msgpack、CBOR)也很流行。再如,除了网络传输,数据存储也需要序列化(如bson格式),数据存储和网络传输的考量要点不同,像bson存储一个int64时是直接写满8个字节,不会使用variant int来减少容量,因为固定长度有助于从磁盘快速寻址。