protobuf c++ API
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); // email
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;
}
protobuf c++ API的更多相关文章
- protobuf python api
摘要: python中一切都可以看作类.那么如何查看每个类的API.使用ipython python protobuf 的函数在message中定义 此处所有的api说明:https://devel ...
- WCF服务上应用protobuf
WCF服务上应用protobuf Web api 主要功能: 支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, updat ...
- 在egret中使用protobuf
原文章删除,重新使用MarkDown排版 在H5游戏领域,对于服务端与客户端的通信协议有一个选择,那就是使用protobuf.js.对于那些直接使用JavaScript开发的引擎而言,protobuf ...
- protobuf ubuntu 18.04环境下安装
(t20190518) luo@luo-All-Series:~/MyFile$ (t20190518) luo@luo-All-Series:~/MyFile$ (t20190518) luo@lu ...
- asp.net core 3.0 gRPC框架小试
什么是gRPC gRPC是google开源的一个高性能.跨语言的RPC框架,基于HTTP2协议,采用ProtoBuf 定义的IDL. gRPC 的主要优点是: 现代高性能轻量级 RPC 框架. 协定优 ...
- ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)
早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着家里电脑刚做了新系统,然后装了VS2019的功夫来体验一把.同时记录体验的过程.如果你也想按照本文的步骤体验的话,那你得先安 ...
- 前端后台以及游戏中使用Google Protocol Buffer详解
前端后台以及游戏中使用Google Protocol Buffer详解 0.什么是protoBuf protoBuf是一种灵活高效的独立于语言平台的结构化数据表示方法,与XML相比,protoBuf更 ...
- impala记录-安装kudu和impala
1.配置/etc/yum.repos.d clouder-kudu.repo [cloudera-kudu]# Packages for Cloudera's Distribution for kud ...
- javascript前端如何使用google-protobuf
1.首先下载google的protobuf的compiler,通过编译器可以将.proto文件转换为想要的语言文件. 下载地址:https://repo1.maven.org/maven2/com/g ...
随机推荐
- 最简单易懂的webService客户端之soap+xml请求
代码准备: 1.网络上有提供一些免费的服务器测试地址,可以上这里找一找:https://my.oschina.net/CraneHe/blog/183471 2.我选择了一个翻译地址:http://w ...
- 修改apache配置文件去除thinkphp url中的index.php
例如你的原路径是 http://localhost/test/index.php/index/add那么现在的地址是 http://localhost/test/index/add如何去掉index. ...
- div.2/C. They Are Everywhere<two pointer>
题意: 给出包含n (3<=n<=100000)个字符的字符串,计算出包含所有类型字符的最小区间长度. 题解: Two pointer.注意区间的处理. #include<cstdi ...
- 源代码管理工具-GIT
源代码管理工具-GIT ---- 一. 掌握 - git 概述 1. git 简介? 什么是git? git是一款开源的分布式版本控制工具在世界上所有的分布式版本控制工具中,git是最快.最简单.最流 ...
- cocos2d CCLOG格式符号表
使用示例: CCLOG(); CCLOG(, 650000L); CCLOG(); CCLOG(); CCLOG(, , , , ); CCLOG("Floats: %4.2f %.0e % ...
- CodeForces 567B Berland National Library
Description Berland National Library has recently been built in the capital of Berland. In addition, ...
- Spring的事务传播机制
1.事务传播类型 新建事务 required required_new - 挂起当前 非事务方式运行 supports not_supported - 挂起当前 never ...
- Warning: Cannot modify header information - headers already sent by ... functions_general.php on line 45
摘自:有用到 http://blog.csdn.net/besily/article/details/5396268 PHP错误:Warning: Cannot modify header infor ...
- VNC轻松连接远程Linux桌面
VNC连接Linux桌面,要想连接Linux远程桌面,按照下面的步骤,非常简单.快速,Linux配置VNC(以RedHat.CentOS.Fedora系列为例). 工具/原料 Linux平台安装VNC ...
- jpda
http://www.ibm.com/developerworks/cn/java/j-lo-jpda1/ 远程调试用rmi通信,被调试端需要启动一个调试服务器,用命令jsadebugd. java/ ...