我的编程空间,编程开发者的网络收藏夹
学习永远不晚

protobuf c++编程笔记

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

protobuf c++编程笔记

字段内容的定义


//文件名:addressbook.proto
syntax = "proto2";//proto版本
//.proto文件新增一个可选的package声明符,用来防止不同的消息类型有命名冲突。
//包的声明符会根据使用语言的不同影响生成的代码。对于C++,产生的类会被包装在C++的命名空间中。
package tutorial;package声明符
message Person {
  required string name = 1;//姓名,= 1 二进制编码中使用的唯一 “标记”
  required int32 id = 2;//ID
  optional string email = 3;//email
  enum PhoneType {//枚举消息类型
    MOBILE = 0;//proto3版本中,首成员必须为0,成员不应有相同的值
    HOME = 1;
    WORK = 2;
  }
//
  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }
  repeated PhoneNumber phones = 4;//phones为数组
}
message AddressBook {
  repeated Person people = 1;
}

修饰符

  • required 必须提供该字段的值,否则消息会被认为是”未初始化的“
  • optional

表示属性值为可选项,不指定使用默认值。int和char数据类型默认为0,string默认为空,bool默认为false,嵌套message默认为构造,枚举为第一个

  • repeated 表示该属性为重复字段,可看走是动态数组,类似于c++中的vector

如果为optional属性,发送端没有包含该属性,则接收端在解析式采用默认值。对于默认值,如果已设置默认值,则采用默认值,如果未设置,则类型特定的默认值为使用,例如string的默认值为”“。

字段类型

  • package

相当于namespace

  • message

相当于clas

  • name

相当于属性值

引用方式

  • 类成员函数变量

package::message.方法()

  • 标准meaasge方法

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

2.string DebugString() const;: 返回 message 的人类可读表达,对调试特别有用

3.void CopyFrom(const Person& from);用给定的 message 的值覆盖 message

4.void Clear();: 将所有元素清除回 empty 状态

不同字段的方法

1)optional修饰的基本类型:

  • set_属性名(val) :初始化修改属性值;
  • 属性名():获取属性值,只读模式,返回类型是::google::protobuf::int64;

2)optional修饰的对象类型:

  • 属性名():返回只读的属性类型对象的引用,属性类型是指pb中定义的对象;
  • mutable_属性名():返回可修改的属性类型对象的指针,属性类型是指pb中定义的对象;
  • set_属性名():初始化设置字段值

3)repeated修饰的基本类型:

  • add_属性名(val):向属性集合中添加元素;
  • 属性名_size():获取集合大小;
  • 属性名(i):返回集合中某一个元素,返回类型::google::protobuf::int64;
  • 属性名():返回只读的整个集合的引用,返回的集合类型是const ::google::protobuf::RepeatedField< ::google::protobuf::int64 >&,可以使用iterator来迭代遍历,可用于修改;
  • mutable_属性():返回可修改的整个集合的指针,返回的集合类型::google::protobuf::RepeatedField< ::google::protobuf::int64 >*,可以使用iterator来迭代遍历,可用于修改;
  • set_属性名(int,x):设置repeated中元素的值

4)repeated修饰的对象类型:

  • add_属性名():返回可修改的属性类型对象的指针(集合中的一个元素),属性类型是指pb中定义的对象;
  • 属性名_size():获取集合大小;

属性名(i):返回集合中某一个元素,返回的是只读的属性类型对象的引用,属性类型是指pb中定义的对象;

  • mutable_属性名(i):返回集合中某一个元素,返回的是可修改的属性类型对象的指针,属性类型是指pb中定义的对象;
  • 属性名():返回只读的整个集合的引用,集合类型是const ::google::protobuf::RepeatedPtrField< pb定义的对象>& XXX const;,可以使用iterator来迭代遍历;
  • mutable_属性名():返回可修改的整个集合的指针,集合类型是::google::protobuf::RepeatedPtrField< pb定义的对象>*,可以使用iterator来迭代遍历;

序列化

  • required字段需要初始化,可以通过IsInitialized来检查是否完成message对象的初始化
  • SerializedAsString(),SerializedToString(std::string* output) 把meaage编码进output
  • SerializedToArray(void*,int)把message编码进数组buff
  • SerializedToOstream(ostream*)把message编码到输出流
  • ByteSize()获取二进制字节序的大小,可用于初始化存放容器

反序列化

  • ParseFromString(std::string& data) 把data解码到message
  • ParseFromArray(char* buf,int size)把buf解码到message,效率比第一个快很多
  • ParseFromIstream(istream*)从istream输入流解码到message
  • has_xxx()用于检查相应字段是否存在数据
  • xxx_size()用于确定repeated字段是否存在,0表示未序列化

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

protobuf c++编程笔记

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java Stream编程笔记

文章目录 Stream介绍什么是 Stream? Stream中间操作过滤操作(filter)映射操作(map)排序操作(sorted)截断操作(limit 和 skip) Stream 的终止操作forEach 和 p
java Stream编程笔记
2023-12-25

[PYTHON] 核心编程笔记(13.P

13.1 介绍类与实例:类与实例相互关联,类是对象的定义,而实例是"真正的实物",它存放了类中所定义的对象的具体信息下面的示例展示如何创建一个类:class MyNewObjectType(bases):    'define MyNewO
2023-01-31

[PYTHON] 核心编程笔记(11.P

11.1 什么是函数?函数式对程序逻辑进行结构化或过程化的一种编程方法,能够整块代码巧妙地隔离成易于管理的小块以下为创建,使用,或引用函数的方法:declaration/definition def foo(): print 'bar'fu
2023-01-31

《Python网络编程基础》笔记

python网络编程基础                          ==================Author: lujun9972 Date: 2013-03-08 22:29:20 CSTTa
2023-01-31

[PYTHON] 核心编程笔记(16.P

16.1 介绍16.1.1 什么是客户/服务器架构?硬件的客户/服务器架构软件客户/服务器架构16.1.2 客户/服务器网络编程16.2 套接字: 通讯端点16.2.1 什么是套接字?套接字是一种具有通讯端点感念的计算机网络数据结构16.2
2023-01-31

[PYTHON]核心编程笔记(15.Py

核心笔记:查找与匹配的比较15.1.1 您的第一个正则表达式:15.2 正则表达式使用的特殊符号和字符常用正则表达式符号和特殊符号:记号       说明                                          举
2023-01-31

[PYTHON] 核心编程笔记(17.P

17.1 什么是因特网客户端?17.2 文件传输17.2.1 文件传输因特网协议流行的有文件传输协议(FTP),Unix-to-Unix复制协议(UUCP),以及网页的超文本传输协议(HTTP),另外,还有(Unix下的)远程文件复制指令s
2023-01-31

[PYTHON] 核心编程笔记(14.P

在python中有多种运行外部程序的方法,比如,运行操作系统命令或另外的python脚本,或执行一个磁盘上的文件,或通过网络来运行文件在特定执行场景包括:在当前脚本继续运行创建和管理子进程执行外部命令或程序执行需要输入的命令通过网络来调用命
2023-01-31

linux shell编程学习笔记(3)

1、什么是变量保存变化的数据——变量名:名称固定,由系统预设或用户自定义——变量值:根据用户设置、系统环境变化而变化2、如何定义变量——变量名=变量的值2.1变量名的规则(1)数字、字母、下划线(2)字母区分大小写(3)当变量名相同时,后赋
2023-01-31

[PYTHON] 核心编程笔记(20.W

20.1 介绍20.1.1 Web应用:客户端/服务器计算20.1.2 因特网20.2 使用Python进行Web应用:创建一个简单的Web客户端20.2.1 统一资源定位符20.2.2 urlparse模块urlparse(urlstr,
2023-01-31

[PYTHON] 核心编程笔记之九-Py

9.2 文件内建函数[open()和file()]内建函数open()[以及file()]提供了初始化输入/输出(I/0)操作的通用接口,open()内建函数成功打开文件后会返回一个文件对象,否则引发一个错误,当操作失败,Python会产生
2023-01-31

NodeJS学习笔记之网络编程

Node提供丰富的网络编程模块Node模块协议netTCPdgramUDPhttpHTTPhttpsHTTPSTCP服务事件分为下面两类 (1)、服务器事件 对于通过net.createServer()创建的服务器而言,它是一个EventE
2022-06-04

Python编程入门到实践 - 笔记(

练习内容包括创建并访问列表列表的索引使用列表中的各个值修改列表中的元素在列表中添加元素 append()在列表中插入元素 insert()在列表中删除元素 del,pop()根据值删除列表中的元素 remove()对列表中的元素进行排列 
2023-01-31

[PYTHON] 核心编程笔记之七-Py

7.1 映射类型:字典字典是Python语言中唯一的映射类型,映射类型对象里哈希值(键)和指向的对象(值)是一对多的关系,字典对象可变,它是一个容器类型,能存储任意个Python对象注:什么是哈希表?哈希表是一种数据结构:哈希表中存储的每一
2023-01-31

[PYTHON] 核心编程笔记之八-Py

8.1 if语句if expression:    expr_true_suite8.1.1 多重条件表达式单个if 语句可以通过使用and,or和not实现多重判断条件或是否定判断条件if not warn and (system_loa
2023-01-31

[PYTHON] 核心编程笔记之四-Py

4.1 Python 对象Python 使用对象模型来存储数据所有的Python对象都拥有三个特性: 身份,类型和值:身份: 每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数id()来得到,这个值可以认为是该对象的内存地
2023-01-31

JUC 并发编程学习笔记(总)

文章目录 1. 什么是JUC2. 进程和线程2.1 进程2.2 线程2.3 并发2.4 并行2.5 线程的状态2.6 wait 和 sleep 的区别 3. Lock锁(重点)3.1 传统Synchronized3.2 Lock
2023-08-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录