1、在.proto文件中定義消息格式
package tutorial; message Person{
required string name =1;
required int32 id =2;
optional string email =3;
enumPhoneType{
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;
}
protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto
// name
inlinebool has_name()const;
inlinevoid clear_name();
inlineconst::std::string& name()const;
inlinevoid set_name(const::std::string& value);
inlinevoid set_name(constchar* value);
inline::std::string* mutable_name();
// id
inlinebool has_id()const;
inlinevoid clear_id();
inlineint32_t id()const;
inlinevoid set_id(int32_t value);
inlinebool has_email()const;
inlinevoid clear_email();
inlineconst::std::string& email()const;
inlinevoid set_email(const::std::string& value);
inlinevoid set_email(constchar* value);
inline::std::string* mutable_email();
// phone
inlineint phone_size()const;
inlinevoid clear_phone();
inlineconst::google::protobuf::RepeatedPtrField<::tutorial::Person_PhoneNumber>& phone()const;
inline::google::protobuf::RepeatedPtrField<::tutorial::Person_PhoneNumber>* mutable_phone();
inlineconst::tutorial::Person_PhoneNumber& phone(int index)const;
inline::tutorial::Person_PhoneNumber* mutable_phone(int index);
inline::tutorial::Person_PhoneNumber* add_phone();
4、枚舉與嵌套類
bool IsInitialized() const: 確認required字段是否被設置
string DebugString() const: 返回消息的可讀表示,用於調試
void CopyFrom(const Person& from): 使用給定消息值copy
void Clear(): 清除所有元素為空狀態
bool SerializeToString(string* output) const: 序列化消息,將存儲字節的以string方式輸出。注意字節是二進制,而非文本;
bool ParseFromString(const string& data): 解析給定的string
bool SerializeToOstream(ostream* output) const: 寫消息給定的c++ ostream中
bool ParseFromIstream(istream* input): 從給定的c++ istream中解析出消息
7、protobuf和 oo設計#include<iostream>
#include<fstream>
#include<string>
#include"addressbook.pb.h"
usingnamespace std;
// This function fills in a Person message based on user input.
voidPromptForAddress(tutorial::Person* person){
cout <<"Enter person ID number: ";
int id;
cin >> id;
person->set_id(id);
cin.ignore(256,'\n');
cout <<"Enter name: ";
getline(cin,*person->mutable_name());
cout <<"Enter email address (blank for none): ";
string email;
getline(cin, email);
if(!email.empty()){
person->set_email(email);
}
while(true){
cout <<"Enter a phone number (or leave blank to finish): ";
string number;
getline(cin, number);
if(number.empty()){
break;
}
tutorial::Person::PhoneNumber* phone_number = person->add_phone();
phone_number->set_number(number);
cout <<"Is this a mobile, home, or work phone? ";
string type;
getline(cin, type);
if(type =="mobile"){
phone_number->set_type(tutorial::Person::MOBILE);
}elseif(type =="home"){
phone_number->set_type(tutorial::Person::HOME);
}elseif(type =="work"){
phone_number->set_type(tutorial::Person::WORK);
}else{
cout <<"Unknown phone type. Using default."<< endl;
}
}
}
// Main function: Reads the entire address book from a file,
// adds one person based on user input, then writes it back out to the same
// file.
int main(int argc,char* argv[]){
// Verify that the version of the library that we linked against is
// compatible with the version of the headers we compiled against.
GOOGLE_PROTOBUF_VERIFY_VERSION;
if(argc !=2){
cerr <<"Usage: "<< argv[0]<<" ADDRESS_BOOK_FILE"<< endl;
return-1;
}
tutorial::AddressBook address_book;
{
// Read the existing address book.
fstream input(argv[1], ios::in| ios::binary);
if(!input){
cout << argv[1]<<": File not found. Creating a new file."<< endl;
}elseif(!address_book.ParseFromIstream(&input)){
cerr <<"Failed to parse address book."<< endl;
return-1;
}
}
// Add an address.
PromptForAddress(address_book.add_person());
{
// Write the new address book back to disk.
fstream output(argv[1], ios::out| ios::trunc | ios::binary);
if(!address_book.SerializeToOstream(&output)){
cerr <<"Failed to write address book."<< endl;
return-1;
}
}
// Optional: Delete all global objects allocated by libprotobuf.
google::protobuf::ShutdownProtobufLibrary();
return0;
}
#include<iostream>
#include<fstream>
#include<string>
#include"addressbook.pb.h"
usingnamespace std;
// Iterates though all people in the AddressBook and prints info about them.
voidListPeople(const tutorial::AddressBook& address_book){
for(int i =0; i <address_book.person_size(); i++){
const tutorial::Person& person = address_book.person(i);
cout <<"Person ID: "<<person.id()<< endl;
cout <<" Name: "<<person.name()<< endl;
if(person.has_email()){
cout <<" E-mail address: "<<person.email()<< endl;
}
for(int j =0; j <person.phone_size(); j++){
const tutorial::Person::PhoneNumber& phone_number = person.phone(j);
switch(phone_number.type()){
casetutorial::Person::MOBILE:
cout <<" Mobile phone #: ";
break;
casetutorial::Person::HOME:
cout <<" Home phone #: ";
break;
casetutorial::Person::WORK:
cout <<" Work phone #: ";
break;
}
cout <<phone_number.number()<< endl;
}
}
}
// Main function: Reads the entire address book from a file and prints all
// the information inside.
int main(int argc,char* argv[]){
// Verify that the version of the library that we linked against is
// compatible with the version of the headers we compiled against.
GOOGLE_PROTOBUF_VERIFY_VERSION;
if(argc !=2){
cerr <<"Usage: "<< argv[0]<<" ADDRESS_BOOK_FILE"<< endl;
return-1;
}
tutorial::AddressBook address_book;
{
// Read the existing address book.
fstream input(argv[1], ios::in| ios::binary);
if(!address_book.ParseFromIstream(&input)){
cerr <<"Failed to parse address book."<< endl;
return-1;
}
}
ListPeople(address_book);
// Optional: Delete all global objects allocated by libprotobuf.
google::protobuf::ShutdownProtobufLibrary();
return0;
}