Google Protocol Buffer Basics: C++

简介: Google Protocol Buffer Basics: C++

proto文件简介


每个元素上的“= 1”,“= 2”标记标识该字段在二进制编码中使用的唯一“标记”


每个字段有三个可选修饰符


required:必须提供字段的值,否则消息将被视为“未初始化”。

optional:字段可以设置也可以不设置。如果未设置可选字段值,则使用默认值。对于简单类型,您可以指定自己的默认值,就像我们对示例中的电话号码类型所做的那样。否则,将使用系统缺省值:数字类型为零,字符串为空字符串,bools为false。

repeated:相当于std的vector,可以用来存放N个相同类型的内容


package tutorial;
message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }
  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }
  repeated PhoneNumber phones = 4;
}
message AddressBook {
  repeated Person people = 1;
}

Compiling Your Protocol Buffers

下载编译器

注意:

1.proto文件路径要有文件名,而–cpp_out路径不能有文件名,只能是路径

protoc xxxx.proto --cpp_out=.

2.最好是cd到proto文件所在的目录再导出,否则会出现生成出来的文件找不到头文件的问题

protobuf生成C++代码时会在同一个目录下生成两个文件,一个.cc一个.h,生成的.cpp文件会include生成的.h文件,而如果不cd到proto文件所在目录去操作,那就可能会出现.cc文件包含.h文件时路径错误


例如:.proto文件在src目录下,导出代码也导出到src目录下,可能执行如下命令

protoc src/xxxx.proto --cpp_out=.

因为你想要C ++类,所以使用–cpp_out选项 - 为其他支持的语言提供类似的选项。


=>得到 pb.h 和pb.cc文件


1.在.h文件中,可以看到


getter的名称是小写的字段,setter方法以set_开头。每个单数(必需或可选)字段还有has_方法,如果该字段已设置,则返回true。最后,每个字段都有一个clear_方法,将字段取消设置为其空状态。


2.字符串字段


调用mutable_email();它将被自动初始化为一个空字符串。inline ::std::string* mutable_email();


3.repeated字段


  • 检查重复元素的_size
  • 获取index指定位置的元素
  • 更新索引的元素
  • 向消息中添加另一个元素,然后可以对其进行编辑(重复的标量类型具有add_,只是允许您传递新值)。


4.一些有用的函数


bool IsInitialized()const ;:检查是否所有必填字段都已设置。

string DebugString()const ;:返回一个人类可读的消息表示,特o别适用于调试。

void CopyFrom(const Person&from);:用给定消息的值覆盖消息。

void Clear();:将所有元素清除回空状态。


重头戏:Parsing and Serialization


bool SerializeToString(string * output)const ;:序列化消息并将字节存储在给定的字符串中。 注意字节是二进制的,而不是文本; 我们只用String类作为一种方便的容器。

bool ParseFromString(const string&data);:解析来自给定字符串的消息。

bool SerializeToOstream(ostream * output)const ;:将消息写入给定的C ++ ostream。

bool ParseFromIstream(istream * input);:解析来自给定C ++ istream的消息。

这些只是为解析和序列化提供的几个选项。 再次,有关完整列表,请参阅Message API参考。

//C++string序列化和序列化API  
bool SerializeToString(string* output) const;  
bool ParseFromString(const string& data);  
//使用:  
void set_people()               
{  
    wp.set_name("sealyao");     
    wp.set_id(123456);          
    wp.set_email("sealyaog@gmail.com");  
    wp.SerializeToString(&pstring);  
}  
void get_people()               
{  
    rsp.ParseFromString(pstring);    
    cout << "Get People from String:" << endl;  
    cout << "\t Name : " <<rsp.name() << endl;  
    cout << "\t Id : " << rsp.id() << endl;  
    cout << "\t email : " << rsp.email() << endl;  
}  


相关文章
|
2月前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
20 0
|
6月前
|
存储 编译器 C++
从Proto到C++:探索Protocol Buffers的强大转换机制
从Proto到C++:探索Protocol Buffers的强大转换机制
692 4
|
6月前
|
安全 编译器 C语言
MISRA C++ 、Google C++ 、AUTOSAR Adaptive Platform编码 C++ 规范总结
MISRA C++ 、Google C++ 、AUTOSAR Adaptive Platform编码 C++ 规范总结
195 1
|
6月前
|
存储 安全 数据安全/隐私保护
穿越编程之海:探索谷歌Protocol Buffers库在C++中的应用
穿越编程之海:探索谷歌Protocol Buffers库在C++中的应用
374 0
|
Go C++
【PAT甲级 - C++题解】1152 Google Recruitment
【PAT甲级 - C++题解】1152 Google Recruitment
63 0
|
6月前
|
数据可视化 定位技术 Sentinel
如何用Google Earth Engine快速、大量下载遥感影像数据?
【2月更文挑战第9天】本文介绍在谷歌地球引擎(Google Earth Engine,GEE)中,批量下载指定时间范围、空间范围的遥感影像数据(包括Landsat、Sentinel等)的方法~
2479 1
如何用Google Earth Engine快速、大量下载遥感影像数据?
|
6月前
|
编解码 人工智能 算法
Google Earth Engine——促进森林温室气体报告的全球时间序列数据集
Google Earth Engine——促进森林温室气体报告的全球时间序列数据集
88 0
|
6月前
|
编解码 人工智能 数据库
Google Earth Engine(GEE)——全球道路盘查项目全球道路数据库
Google Earth Engine(GEE)——全球道路盘查项目全球道路数据库
143 0
|
6月前
|
编解码
Open Google Earth Engine(OEEL)——matrixUnit(...)中产生常量影像
Open Google Earth Engine(OEEL)——matrixUnit(...)中产生常量影像
76 0
|
6月前
Google Earth Engine(GEE)——导出指定区域的河流和流域范围
Google Earth Engine(GEE)——导出指定区域的河流和流域范围
263 0