目录

protobuf初探

起因

以前是通过grpc知道的protobuf,未尝试过,以为挺复杂,一直没怎么重视过。 后来因为tensorflow的很多地方用到了protobuf,正好我又在研究消息传递,如何优化numpy传输。

protobuf是什么

Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议。比xml, 更小,更快,更简单.

好不好用

  • 优点

a. 语言无关、平台无关。(pickle等, 依赖语言) b. 无依赖问题。(pickle等, 依赖关联引用) c. 无安全漏洞. (pickle等, 有安全漏洞) d. 体积更小, 性能好 (经过压缩,编码, 比json,xml等更小) e. 简单易用. (算是简单易用)

  • 缺点

a.需要事先定义,缺少灵活性 (从另一种角度理解,反而是优点。清楚的定义了数据格式。)

安装

  • 环境 操作系统: fedora 开发语言: python3

  • 安装编译器

yum install protobuf-compiler

  • 安装api

pip install protobuf

  • 定义message

person.proto

syntax="proto3";
package example;

message person {
    int32 id=1;
    string name = 2;
}

message all_person {
    repeated person Per = 1;
}
  • 编译

protoc person.proto –python_out=.

  • 序列化
import person_pb2

pers = person_pb2.all_person()
p1 = pers.Per.add()
p1.id=1
p1.name="xieyanke"

p2 = pers.Per.add()
p2.id=2
p2.name="pythoner"


#序列化
data = pers.SerializeToString()
print(data)

# 解析
target = person_pb2.all_person()
target.ParseFromString(data)
print(target)

测试

体积测试:根据自己的需要定义message, 对比其它方式的序列化结果。

总结

protobuf跨语言、无依赖、体积小、速度快。优势比较明显。需要先定义也并不算是缺点.