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 ...
随机推荐
- 【转】How to build and install PHP 5.6.9 from source on Ubuntu 14.04 VPS
原文 https://vpsineu.com/blog/how-to-build-and-install-php-5-6-9-from-source-on-ubuntu-14-04-vps/ In t ...
- 【servlet】 第一个servlet
简单打印haha Helloyt.java package day01; import java.io.IOException; import javax.servlet.ServletConfig; ...
- 视频录制SurfaceView
package com.bw.videorecorder; import java.io.File;import java.io.IOException; import android.media.M ...
- 转:loadruner报错:Step download timeout(120 seconds)的一个解决方法
一个网友问了我一个问题如下:loadruner报错:Error -27728: Step download timeout (120 seconds) 如何解决语法检查通过,但是在并发执行一个查询时候 ...
- Elasticsearch head安装
es5.0目前没有head插件所以不要下载错而是版本导致无法安装head; 安装head命令在es的bin目录下执行 ./plugin install mobz/elasticsearch-head ...
- C# 通过接口 post 请求
/// <summary> /// 提交数据请求 方法一 /// </summary> /// <param name="POSTURL">请求 ...
- MFC乱七八糟笔记
1.CBitmap------------------------------------------------------------------------------------- 1.类层次 ...
- margin:0 auto在ie7浏览器里面无效
把文件头改成 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w ...
- Socket在手机上的应用
usb读取:pid vid --可以唯一的确定设备获取手机驱动socket固定端口通信 wifipc机在局域网内,udp的数据包(整个网段) 蓝牙配对 bluetoothsocket 如果放大:可以分 ...
- iOSFMDB和CoreData
转发:http://wenku.baidu.com/link?url=LSPSZSPxN4pVwWNwqEXSoY0-jlnXq-_14C7qV1FV9_gFIMPjdKlXrG4Nrh_08EZS1 ...