一。protobuf安装
下载最新的源文件https://github.com/google/protobuf
,我使用的版本是
v2.6.1.zip
下载gtest文件
gtest-1.5.0.tar.gz,解压到protobuf-2.6.1下,并重命名为gtest。(执行autogen.sh脚本时会使用该文件)
./autogen.sh ./configure make make check make install
检查是否安装完成
protoc --version
export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/usr/local/lib64:/usr/lib64
安装python版本
进入protobuf-2.6.1/python目录下
python setup.py build python setup.py google_test python setup.py install
进入python的IDE
安装完成
二。使用protobuf完成前后端交互
protobuf的格式网上有很多,参考地址http://www.jianshu.com/p/0dcef6fe11c8
1.新建一个测试文件addressbook.proto,内容如下:
package addressbook;
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType{
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
编译addressbook.proto文件后生成addressbook_pb2.py:
protoc -I=/root/ --python_out=/root/ /root/addressbook.proto
2.写入addressbook.proto结构体中字段的值
SerializeToString(): 序列化这个message和以字符串的方式返回。 注意,这是二进行字节,不是一个文本; 我们只使用str类型作为一个方便的容器。
import addressbook_pb2
def PromptForAddress(person):
person.id = 1
person.name = "zhuobaobao"
person.email = "zhuobaobao@gmail.com"
phone_number = person.phone.add()
phone_number.number = "1590000000"
phone_number.type = addressbook_pb2.Person.HOME
address_book = addressbook_pb2.AddressBook()
PromptForAddress(address_book.person.add())
with open("test.txt","w") as f:
f.write(address_book.SerializeToString())
3.读取test.txt文件中proto结构的数据
ParseFromString(data): 从给出的字符串中解析一条message。
import addressbook_pb2
def ListPeople(address_book):
for person in address_book.person:
print "person ID:",person.id
print "name:",person.name
if person.HasField("email"):
print "email address:",person.email
for phone_number in person.phone:
if phone_number.type == addressbook_pb2.Person.HOME:
print "home phone:",
elif phone_nummber.type == addressbook_pb2.Person.WORK:
print "work phonne:",
print phone_number.number
address_book = addressbook_pb2.AddressBook()
with open("test.txt","r") as f:
address_book.ParseFromString(f.read())
ListPeople(address_book)