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 ...
随机推荐
- java解析XML获取城市代码
运行前先导入dom4j架包,由于我们公司用的代理服务器所以下面我设置了代理ip,不需要的可直接忽略 package com.chengshidaima.tools; import java.io.Bu ...
- Cormen — The Best Friend Of a Man
Cormen — The Best Friend Of a Man time limit per test 1 second memory limit per test 256 megabytes i ...
- oracle数据库的一次异常起停处理。
在重启数据库的时候,忘记把一个应用关停了,想起来的时候,就ctrl+c,把数据库shutdown immediate 给强制停下了,把该应用再停止,然后shutdown immdiate,这时候数据报 ...
- iOS 常用代码块
1.判断邮箱格式是否正确的代码: // 利用正则表达式验证 -( BOOL )isValidateEmail:( NSString *)email { NSString *emailRegex ...
- 提高MySQL查询速度
参考百度知道 关于mysql处理百万级以上的数据时如何提高其查询速度的方法 最近一段时间由于工作需要,开始关注针对Mysql数据库的select查询语句的相关优化方法. 由于在参与的实际项目中发现当m ...
- 动态规划之----我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
利用动态规划,一共有n列,若从左向右放小矩形,有两种放置方式: 第一种:横着放,即占用两列.此时第二行的前两个空格只能横着放,所有,总的放置次数变为1+num(2*(n-2)),其中2*(n-2)代表 ...
- Linux学习 -- 日志管理
日志服务 rsyslogd CentOS6 取代了原来的syslog rsyslogd 默认启动.自启动 常用命令:lastb.lastlog.last.w.who.users. 系统默认日志 和 ...
- 关于c中的inline
在c中,为了解决一些频繁调用的小函数大量消耗栈空间或是叫栈内存的问题,特别的引入了inline修饰符,表示为内联函数.栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的 ...
- robot_framewok自动化测试
robot_framewok自动化测试 http://wenku.baidu.com/view/691abcaa4b73f242336c5fec.html 接口自动化测试框架设计 http://wen ...
- 如何修改apache的默认web端口
在apache的安装文件夹里搜索 httpd.conf 文件,用记事本打开,搜索 Listen 80 ,把80(默认端口)改为你想用的端口,保存,重新启动apache服务即可!