Protobuf全称Protocol Buffers,是一个Google开发的一套用于数据存储,网络通信时用于协议编解码的工具库。它与XML和Json数据类似,但具有更高的速度和效率。
先介绍一下Protobuf的数据格式,required,optional和repeated,以下面这段代码为例:
//定义Protobuf数据格式
message Person{
required string name = 1; //必须项
optional string gender = 2; //可选项
repeated string skills = 3; //可重复项,可以理解为数组
}
在上述代码中,数字【1-3】是Protobuf数据的标识,每个字段拥有唯一的标识符,根据标识符可以区分不同的字段。在一个标准的Protobuf数据中,一般至少有一个required的数据,且为使用数据前必须设置的值,即初始化时必须为带有required属性的变量赋值,optional和repeated可以不必赋值,但optional使用时只能赋一个值,而repeated可以添加多项。
下面以一个实际的项目来理解Potobuf数据从定义到使用的过程,以python环境下为例。
假设目录结构如下:
demo
|————demo.py
|————person.proto
其中,person.proto文件中为第一段代码中的内容。通过protoc可以将proto文件编译为python调用的文件。
protoc -I=./ --python_out=./ ./person.proto
//-I参数为需要编译的proto文件所在的目录
//--python_out为编译输出文件保存的目录
//最后一个参数为编译的文件的目录文件名
编译结束后,会在设定目录下生成一个名为person.py的文件,目录结构如下:
demo
|————demo.py
|————person_pb2.py
|————person.proto
通过如下代码,可以调用person.py文件。
from person_pb2 import Person
def main():
demo = Person()
demo.name = 'demo'
demo.gender = 'male'
demo.skills.append('walk')
demo.skills.append('run')
print demo
# 写demo
with open('demo.io', 'wb+') as f:
f.write(demo.SerializeToString())
# 读demo
with open('demo.io', 'rb') as f:
demo1 = Person()
demo1.ParseFromString(f.read())
print demo1
if __name__ == "__main__":
main()
简而言之,protobuf可以理解为简化版的类的定义方法。