Protobuf基础之proto文件的编译和使用

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对象。

 

猜你喜欢

转载自sharley.iteye.com/blog/2375059