- 安装:
首先去官网查看相应的安装教程:protocol 我是这样做的,首先安装C++版本的(我的平台是ubuntu):
C++版本的protocol安装
1. 安装相应的依赖环境
sudo apt-get install autoconf automake libtool curl make g++ unzip
2. 因为我用的是python3,所以我不确定python2按照我的步骤能不能成功。如果你想跟我一样,那么就先切换下python版本:
echo alias python=python3 >> ~/.bashrc
source ~/.bashrc
python --version #查看下是不是切换成功
3. 克隆源码
git clone git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
./autogen.sh
配置,安装
./configure
make
make check
sudo make install
sudo ldconfig # refresh shared library cache.
python版本安装:
cd protobuf
cd python
python setup.py build
python setup.py test#查看是不是测试通过
sudo python setup.py install#安装protobuf
至此安装成功
相关的使用方法,在这里就不写了,直接丢一个官网链接去看吧:protobuf python使用
兴趣使然,继续把官网的使用教程翻译一下:
addressbook.proto:
syntax = "proto2";
package people;
message Person{
optional string name = 1;
optional int32 id = 2;
optional string email = 3;
enum PhoneType{
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
optional string number = 1;
optional PhoneType type = 2 [default = HOME];
}
//一个人的PhoneNumber不止一个,所以可以设置为repeated字段
repeated PhoneNumber phones = 4;
}
message AddressBook{
//
repeated Person People = 1;
}
编译一下该.proto文件,生成相应的python文件
protoc -I=./ --python_out=./ ./addressbook.proto
-I: 表示的是后边.proto所在的路径,
--python_out: 一方面表示将proto转成python格式的,另一方面表示存放的路径在哪
最后一个参数表示的是你想要转换的.proto文件是在哪
在这里有几点要注意的:字段的属性,这里有四个可以理解:
repeated: 该字段可以重复任意次(包括零次)。 重复值的顺序将保留在协议缓冲区中。 将重复字段视为动态大小的数组,注意理解数组!!!
optional: 个人理解:这个选项是可以选择赋初始值与不赋初始值。如果不赋初始值,可以设置默认的选项,但是如果没有设置默认值的话,那就是按照系统自己的默认方式去给这些变量赋值了。
enum: 就是一个C/C++中的枚举而已
message: 就是可以在message(可以理解为struct)中嵌套message
writeToSerialed.py:
#!/usr/bin/env python
# coding=utf-8
import addressbook_pb2
import sys
def PromptForAddress(person):
person.id = int(input("Enter person ID number: "))
person.name = input("Enter name: ")
email = input("Enter email address (blank for none): ")
if email != "":
person.email = email
while True:
number = input("Enter a phone number (or leave blank to finish): ")
if number == "":
break
phone_number = person.phones.add()
phone_number.number = number
type = input("Is this a mobile,home,or work phone?")
if type == "mobile":
phone_number.type = addressbook_pb2.Person.PhoneType.MOBILE
elif type == "home":
phone_number.type = addressbook_pb2.Person.PhoneType.HOME
elif type == "work":
phone_number.type = addressbook_pb2.Person.PhoneType.WORK
else:
print("Unknown phone type; leaving as deafult value.")
if len(sys.argv) != 2:
print("Usage: {} ADDRESS_BOOK_FILE".format(sys.argv[0]))
sys.exit(-1)
address_book = addressbook_pb2.AddressBook()
try:
f = open(sys.argv[1],"rb")
address_book.ParseFromString(f.read())
f.close()
except IOError:
print("{}: Could not open file. Creating a new one {}".format(sys.argv[1]))
#Add an address,注意,我这里理解的是因为People是一个repeated字段的元素,所以类似数组,那么你就需要使用add()方法去开辟一个空间,所以得使用add()方法
PromptForAddress(address_book.People.add())
f = open(sys.argv[1],"wb")
f.write(address_book.SerializeToString())
f.close()
如何运行上面的代码,首先创建一个文件addressbookSerialized(空文件就好),然后运行:
python writeToSerialed.py addressbookSerialized#就可以将你的输入通过序列化写入到addressbookSerialized中去了
如何从序列中读取这些原先的数据呢?
readFromSerialed.py:
#!/usr/bin/env python
# coding=utf-8
import addressbook_pb2
import sys
def ListPeople(address_book):
for person in address_book.People:
print("Person ID: {}".format(person.id))
print(" Name: {}".format(person.name))
if person.HasField('email'):
print("E-mail address: {}".format(person.email))
for phone_number in person.phones:
if phone_number.type == addressbook_pb2.Person.PhoneType.MOBILE:
print(" Mobile phone #: ")
elif phone_number.type == addressbook_pb2.Person.PhoneType.HOME:
print(" HOME phone #: ")
elif phone_number.type == addressbook_pb2.Person.PhoneType.WORK:
print(" Work phone #: ")
print(phone_number.number)
if len(sys.argv ) != 2:
print("Usage: {}, ADDRESS_BOOK_FILE".format(sys.argv[0]))
sys.exit(-1)
address_book = addressbook_pb2.AddressBook()
f = open(sys.argv[1],"rb")
address_book.ParseFromString(f.read())
f.close()
ListPeople(address_book)