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 ...
随机推荐
- 从市场运营角度谈Uber中国的第一批用户是怎么来的
声明:这篇文章是从http://www.010lm.com/redian/2016/0312/1206875.html转来的,分享给大家. 1)首先告诉用户Uber是做什么的?即培养用户品牌意识. 我 ...
- Struts2值栈详解
1. 关于值栈: 1). helloWorld 时, ${productName} 读取 productName 值, 实际上该属性并不在 request 等域对象中, 而是从值栈中获取的. 2). ...
- 安卓开发-使用XML菜单布局简单介绍
使用xml布局菜单 目前为止我们都是通过硬编码来增加菜单项的,android为此提供了一种更便利的方式,就是把menu也定义为应用程序的资源,通过android对资源的本地支持,使我们可以更方便地 ...
- VideoView的视频的全屏播放
import android.net.Uri;import android.os.Bundle;import android.app.Activity;import android.content.I ...
- 在Activity之间使用Intent传值和Bundle传值的区别和方式
两者本质上没有任何区别.Bundle只是一个信息的载体 将内部的内容以键值对组织 Intent负责Activity之间的交互 自己是带有一个Bundle的Intent.putExtras(Bundle ...
- 2015年5月9日 student information management system
/*大作业SIMS*///头文件 #ifndef __FUNC_C__ #define __FUNC_C__ #include <stdio.h> #include <stdlib. ...
- 4--OC --合成存取器方法
1. 从OC 2.0开始就已经可以自动生成设置函数方法和获取函数方法(统称为存取器方法). 什么是 @property 和 @synthesize ? @property 和 @synthesize ...
- Win7下用easyBCD引导安装Ubuntu15.04
1 准备工作 easyBCD中添加一个启动项 修改启动项配置文件 注意两点:C盘设备号,镜像名称 title Install Ubuntu root (hd0,) kernel (hd0,)/vmli ...
- USACO Section 1.3 Wormholes 解题报告
题目 题目描述 在一个二维平面上有N个点,这N个点是(N/2)个虫洞的端点,虫洞的特点就是,你以什么状态从某个端点进去,就一定会以什么状态从另一端的端点出来.现在有一头牛总是沿着与X轴正方向平行的直线 ...
- 编译filezilla
编译zilla的时候,需要用到与mysql连接的地方(这里先忽略zila的编译) VC听过mysql connector c++, 下载了1.1.3版本,然后飞安装包,之后从官网上下载boost 把库 ...