1、创建测试用的proto源文件,如:StudentInfo.proto,内容如下
message StudentInfo{ required int32 id = 1; required string name = 2; optional string email = 3; }
2、cmd命令行进入protobuf源代码文件夹下的src目录下,运行命令:
protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/*.proto
本例中StudentInfo.proto放在了src目录中,且编译proto生成的py文件也放在src中,故命令为:protoc -I=./ --python_out=./ StudentInfo.proto
编译成功后,src目录下生成了一个StudentInfo_pb2.py文件:
3、在测试程序中如果要用到上述_pb2.py文件,需要先import到程序中,下面是一个简单的Demo:
import StudentInfo_pb2 import sys pb_send_obj = StudentInfo_pb2.StudentInfo() pb_send_obj.id = 10 pb_send_obj.name = "Lily" pb_send_obj.email = "[email protected]" print pb_send_obj sendDataStr = pb_send_obj.SerializeToString() print "serialized string: ", sendDataStr #----------------------------# # message transmission # #----------------------------# pb_receive_obj = StudentInfo_pb2.StudentInfo() pb_receive_obj.ParseFromString(sendDataStr) print "Parse: " print pb_receive_obj.id print pb_receive_obj.name print pb_receive_obj.email
运行结果如下:
4、序列化和反序列化
python protobuf 模块中常用的序列化和反序列化API如下:
• SerializeToString():将message序列化并返回str类型的结果(str类型只是二进制数据的一个容器而已,而不是文本内容)。如果message没有初始化,抛出message.EncodeError异常。
• SerializePartialToString():将message序列化并返回str类型的结果,但是不检查message是否初始化。
• ParseFromString(data):从给定的二进制str解析得到message对象。