首页 > 编程语言 >protobuf在c++中的使用

protobuf在c++中的使用

时间:2023-08-02 16:44:25浏览次数:32  
标签:protobuf 修饰符 字段 c++ proto2 proto3 使用 默认值 字节

一、安装

sudo apt install libprotobuf-dev protobuf-compiler

二、编辑proto文件,生成代码文件

proto语法分为“proto2”和”proto3“两个版本,指定方法是在proto文件中第一行写入:syntax = "proto3"; ,这样指定使用proto3版本的语法,如果不指定,默认是使用proto2的语法。

两个语法的区别:

  • 字段修饰符:在proto2中,需要指定字段修饰符为optional(0个或者1个此字段)required(1个此字段)或repeated(0个或多个此字段)。而在proto3中,支持的字段修饰符为singular(0个或者1个此字段)、repeated(0个或多个此字段),不指定字段修饰符的话默认字段修饰符是singular,相当于proto2中optional。

  • 默认值:在proto2中,字段可以有默认值,在定义后使用[default = xx]来指定。而在proto3中,不支持指定默认值,字符串默认空字符串,字节默认空字节,bool类型默认false,数字类型默认0等等。

  • oneof:在proto2中,可以使用oneof关键字来定义一组互斥的字段,只能有一个字段被设置。而在proto3中,oneof功能保持不变,但默认情况下,一个oneof字段将占用1个字节的空间。

  • Unknown Fields:在proto2中,未知字段(即消息中定义了但解析时不存在的字段)会被保留在unknown_fields()中,以便后续处理。而在proto3中,未知字段会被丢弃,但是在3.5版本及以后,好像又支持未知字段了。

使用注意事项:

  • 字段的默认值:由于proto3中所有字段都没有默认值,因此在升级到proto3时需要特别注意字段的默认值,以确保正确地处理消息。

  • proto2和proto3混用:proto2和proto3是不兼容的,不能在同一个消息中混用这两种版本的字段。

使用protoc --cpp_out=<输出目录>  <proto文件> ,就可以生成对应的代码文件。

三、常用接口方法

bool SerializeToString(string* output):将当前结构体对象序列化为string字符串,存储在output中。

bool ParseFromString(const string& data):把string类型的数据,转换到结构体。

bool SerializeToArray(void* data, int size):将当前结构体对象序列化为字节数组,存储在buffer中,存储size个字节。

bool ParseFromArray(const void * data, int size):从buffer中解析字节数组,并更新当前结构体对象的值。

void Clear():清除全部的字段,还原为各字段的默认值。用这个方法的好处是可以复用此结构,不用重新分配内存。

int64_t ByteSizeLong() 或 int ByteSize() :返回当前结构体对象序列化后的字节大小。ByteSize目前已经弃用,推荐使用ByteSizeLong()。

 

标签:protobuf,修饰符,字段,c++,proto2,proto3,使用,默认值,字节
From: https://www.cnblogs.com/zxq89/p/17600740.html

相关文章

  • SSH 使用 root 权限登录 Nas
    一、启用SSH服务转到Synology设备的终端设置页面:SynologyNAS:DSM控制面板>终端机和SNMP>终端机勾选启用SSH服务。指定SSH连接的端口号并保存设置。为了确保系统安全性,建议将默认端口22替换为其他端口号。 二、sshDSM/SRM管理员帐户@DSM/SRMIP地址-pSSH......
  • Linux su命令:su命令语法、su root与su - root区别、su与sudo区别、su -c 参数的使用理
    https://www.cnblogs.com/goloving/p/15150206.html Linuxsu(英文全拼:switchuser)命令用于变更为其他使用者的身份,除root外,需要键入该使用者的密码。使用权限:所有使用者。一、语法su[-fmp][-ccommand][-sshell][--help][--version][-][USER[ARG]]1、参数说......
  • 使用cron来定时执行脚本的步骤
    创建一个脚本,比如:/opt/port_stats.sh,脚本内容:#!/bin/bash#设置要监控的端口列表ports=({80,8080,456})#执行一次循环forportin"${ports[@]}";do num=$(netstat-nat|grep":"$port|wc-l) echo"[$(date'+%Y-%m-%d%H:%M:%S')]$port$num"&......
  • php-elasticsearch客户端基本使用
    php-elasticsearch客户端基本使用标签(空格分隔):php,elasticsearch官方文档:https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/getting-started-php.html#_searching_documents官方中文文档(已过时):https://www.elastic.co/guide/cn/elasticsearch/php/cur......
  • Vue学习笔记:VCA下使用provide与 inject
    在VCA模式下使用provide和inject与之前文档中VOA模式类似,不同的是需要在使用前进行importimport{provide,inject}from'vue'在此篇文档中,使用一个示例来演示provide与inject的使用功能如下:组件NavbarDetailList部署在根组件App上。在初始页面,显示Navbar与List。List组件......
  • 使用HTTP代理时的小技巧
     作为HTTP代理产品供应商,我们深知使用HTTP代理的重要性和优势。我们将为您详细介绍使用HTTP代理的小技巧,让您能够在实际应用中更加高效地利用HTTP代理,享受到更畅通的互联网体验。 一、选择稳定可靠的HTTP代理服务供应商 选择稳定可靠的HTTP代理服务供应商是使用HTTP代理的......
  • ROS参数使用与编程方法
    参数参数概念在ROSMaster中,存在一个参数服务器(ParameterServer),它是一个全局字典,即一个全局变量的存储空间,用来保存各个节点的配置参数。各个节点都可以对参数进行全局访问。创建功能包cd~/catkin_ws/srccatkin_create_pkglearning_parameterroscpprospystd_srvs参数......
  • C/C++ 数据结构五大核心算法之分治法
    分治法——见名思义,即分而治之,从而得到我们想要的最终结果。分治法的思想是将一个规模为N的问题分解为k个较小的子问题,这些子问题遵循的处理方式就是互相独立且与原问题相同。两部分组成:分(divide):递归解决较小的问题治(conquer):然后从子问题的解构建原问题的解三个步骤:1、......
  • C# LINQ中使用聚合函数报错 Sequence contains no elements
    问题:在一个linq查询中使用了平均值聚合函数Average,结果报错Sequencecontainsnoelements(序列不包含任何元素)也就是说,使用某些linq的函数时,如果值不存在是会报错的,比如:First()Single()FirstAsync()SingleAsync()Last()LastAsync()Max()Min()Average()等,解决方案:......
  • JDK8流的使用
    ​流的作用,将原先命令式的编程思想转换成声明式编程,是编程思想的改变,应尽快学习利用。流是从支持数据处理操作的源生成的元素序列,源可以是数组、文件、集合、函数。流不是集合元素,它不是数据结构并不保存数据,它的主要目的在于计算。涉及到以上四种,都可以试着用流处理。流的作用......