Protobuf 总结

Protobuf是什么 Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于通信协议和数据存储等。 传输协议 - 如json、XML IDL - 接口描述语言 存储格式 - 序列化压缩后存储到数据库 核心竞争力 向前向后兼容性 - 新老版本兼容,无需考虑版本升级 多语言代码生成 - 支持Java、Python、PHP、Go等编程语言 快&小 - 序列化、反序列化速度快,压缩比优秀 关键技术 varints编码 每个字节使用其中7位保存数字,最高位表示后面是否还有内容 低位在前,高位在后 保留了fixed32和fixed64,用于传递大的正数 int32、int64、unit32、uint64、bool,序列化结果相互兼容,可以修改 zigzag编码 传统上,负数最高位为1,小负数会浪费编码长度 (n<<1)^(n>>31) -1将会被编码成1,1将会编码成2,-2将会被编码成3 sint32和sint64使用zigzag编码 message structure编码 Tag-Value编码 Tag=(field_number<<3)|wire_type->varints wire_type:0表示varints,1表示固定64位,5表示固定32位 wire_type:2表示Tag-Length-Value编码(TLV),Length使用varints string、bytes、message嵌套,都采用TLV编码 wire_type只有0、1、2、5,那么3和4去哪了?—被废除了 repeated编码 第一种方式:重复出现的相同tag 第二种方式:(packed=true),TLVVV…编码 仅有数字类型才可以使用第二种方法,protocol buffers 3(pb3)中默认第二种,pb2中需要指定,第一种任何情况下会被支持 非repeated情况出现重复tag,后面的覆盖前面的,因此optional和repeated相互兼容 Map编码 map<key_type,value_type>map_field=N 序列化结果完全等价于: message MapFieldEntry { key_type key = 1; value_type value = 2; } repeated MapFieldEntry map_field = N; protoc编译器 C++编写的proto文件编译器 支持各种语言编写的插件,使用进程间通信传递信息 Android和iOS上有对应的插件支持,自动调用protoc Github地址:https://github....

2019-03-14 · 1 min · L