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;
}
Google Protocol Buffer Basics: C++的更多相关文章
- Protocol Buffer Basics: Python
原文https://developers.google.com/protocol-buffers/docs/pythontutorial Protocol Buffer Basics: Python ...
- Google Protocol Buffer 的使用和原理[转]
本文转自: http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构 ...
- Google Protocol Buffer 的使用
简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...
- 学习Google Protocol buffer之概述
XML这种属于非常强大的一种格式,能存储任何你想存的数据,而且编辑起来还是比较方便的.致命的缺陷在于比较庞大,在某些情况下,序列化和解析都会成为瓶颈.这种对于实时性很强的应用来说,就不太适合了,想象下 ...
- Google Protocol Buffer的安装与.proto文件的定义
什么是protocol Buffer呢? Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准. 我理解的就是:它是一种轻便高效的结构 ...
- Google Protocol Buffer 的使用和原理
Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...
- Google Protocol Buffer 的编码方式
Google Protocol Buffer 使用到了两种编码方式:Varints 和 zigzag. 一 Varints 编码 每个 byte 只用 7bit 表示数字,最高位 bit作为标志位,如 ...
- Google Protocol Buffer 协议
1. Protocol Buffers 简介 Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化 ...
- Google Protocol Buffer
Google Protocol Buffer(protobuf)是一种高效且格式可扩展的编码结构化数据的方法.和JSON不同,protobuf支持混合二进制数据,它还有先进的和可扩展的模式支持.pro ...
随机推荐
- 「数据分析」Sqlserver中的窗口函数的精彩应用之数据差距与数据岛(含答案)
上一篇介绍过数据差距与数据岛的背景,这里不再赘述,请翻阅上一文.此篇在Sqlserver上给大家演示1000万条记录的计算性能. 测试电脑软硬件说明 一般般的笔记本电脑,2017年7月,价格:4500 ...
- 个人永久性免费-Excel催化剂功能第20波-Excel与Sqlserver零门槛交互-数据上传篇
Excel作为众多数据存储的交换介质,在不同的系统内的数据很少可以很连贯地进行整合分析,一般的业务系统都会提供导出Excel作为标配功能供用户使用系统内生成的数据. 此时最大的问题是,Excel很维去 ...
- python面向过程编程小程序 -ATM(里面用了终端打印)
06.09自我总结 1.文件摆放 ├── xxxx │ ├── run.py │ └── fil_mode.py │ └── data_time.py │ └── loading.py │ └── d ...
- PHP对接口执行效率慢的优化
PHP对接口执行效率慢的优化 PHP对接口执行效率慢的优化 造成执行效率低的原因可以由很多方面找原因 从代码层面,代码质量低,执行效率也会有很大影响的. 从硬件方面,服务器配置低,服务器配置是基础,这 ...
- Shiro权限管理框架(一):Shiro的基本使用
首发地址:https://www.guitu18.com/post/2019/07/26/43.html 核心概念 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码 ...
- Linux vi/vim使用
vi/vim 基本使用方法 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令. 1.vi的基本概念 基本上vi ...
- Floyd—Warshall算法
我们用DP来求解任意两点间的最短路问题 首先定义状态:d[k][i][k]表示使用顶点1~k,i,j的情况下,i到j的最短路径 (d[0][i][j]表示只使用i和j,因此d[0][i][j] = c ...
- 100天搞定机器学习|Day8 逻辑回归的数学原理
机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...
- spring源码分析之配置文件名占位符的解析(一)
一.直接写个测试例子 package com.test; import org.junit.Test; import org.springframework.context.ApplicationCo ...
- c&c服务器(command and control server)
远程命令和控制服务器,目标机器可以接收来自服务器的命令,从而达到服务器控制目标机器的目的.该方法常用于病毒木马控制被感染的机器.