protobuf 是一种轻便高效的结构化数据储存格式。支持跨平台。优点是传输的时候,数据可以压缩很小。传输效率高。
protobuf 利用protoc编译 .proto 文件生成 xxx.pb2.py。在XXX.pb2.py 中序列化【编码】XXX.proto 文件。
- 定义message 结构
protobuf 将一种结构称为message 类型
- 1,2,3是field 对应的数字id,id再1到15之间的编码只需要占一个字节,包括filed数据类型和feild对应的数字id. 在16到2047 之间编码需要占用两个字节,所以最常用的数据对应的id 应该尽量小一些。
- field 最前面的required【只有一个】,optional【0个或1个】,repeated是filed的规则【0个或任意个】。
- 保留filed 和filed number。每个filed对应唯一的数字id,但是如果该结构在之后的版本中某个filed 被删除了,为了保持向前的兼容性,需要将一些id 或者名称设置为保留的,即不能被用来定义新的field.
- message 扩展
在另一个文件中,import 这个proto之后,可以对Person这个message进行扩展。
extend Person { optional int32 bar = 126; }
- 定义message 结构
protobuf 的反射机制
https://www.cnblogs.com/swey/p/4733638.html
protobuf 通过proto文件生成相应的message和service. protobuf也通过proto文件提供反射机制。程序在运行时可以通过proto获取任意message 和任意service的属性和方法。也可以运行时调用message的属性和方法。
protobuf 的序列化和反序列化【包含简单应用的例子】
https://www.cnblogs.com/pheobe/p/5761130.html
获取message和service的属性和方法:
protobuf 通过Descriptor 获取任意message 或service的属性和方法,Descriptor主要包括以下类型:
FileDescriptor 获取proto文件中的Descriptor和ServiceDescriptor
Descriptor 获取类message属性和方法,包括FieldDescriptor 和 EnumDescriptor等
FieldDescriptor 获取message中各个字段的类型、标签、名称等
EnumDescriptor 获取Enum中的各个字段名称、值等
ServiceDescriptor 获取service中的MethodDescriptor
MethodDescriptor 获取各个rpc中的request、response、名称等
PS:暂且总结到这边,有什么再添加。附上几个有用的链接:
https://www.cnblogs.com/zchajax/p/5783258.html protobuf 开发者指南
https://www.jianshu.com/p/419efe983cb2
protobuf 的API: