1. 安装:
    首先去官网查看相应的安装教程: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)