Proto文件相关知识
百度Apollo的数据结构常用proto文件来定义, proto
文件允许你以类似于C++结构体或类的方式定义数据结构。你可以在这个文件中定义简单数据类型、枚举、消息类型等。
基于proto
文件,Protocol Buffers编译器(protoc
)可以自动生成对应的C++类。这些类提供了序列化和反序列化的方法,以及各种数据操作的方法。
本文是对proto用法的一些积累:
Protocol Buffers 的基本用法
-
定义数据结构(.proto 文件):
你需要首先编写一个
.proto
文件,用于定义你的数据结构。例如,定义一个简单的Graph
和Node
:syntax = "proto3";message Node {string lane_id = 1;string road_id = 2;// 其他字段... }message Graph {repeated Node node = 1;// 其他字段... }
syntax = "proto3";
指定使用 Protocol Buffers 的第三个版本语法。message
用于定义数据结构。- 每个字段都有一个唯一的编号(如
1
,2
),用于在序列化时标识字段。
-
生成代码:
使用
protoc
编译器,根据.proto
文件生成目标编程语言的代码。例如,生成 C++ 代码:protoc --cpp_out=. graph.proto
这会生成相应的
.pb.h
和.pb.cc
文件,你可以在项目中包含并使用这些生成的类。
例如Apollo中的node_creator.h
中,便引用了以下头文件:
#pragma once
#include <string>
#include "modules/map/proto/map_lane.pb.h"
#include "modules/routing/proto/routing_config.pb.h"
#include "modules/routing/proto/topo_graph.pb.h"
namespace apollo {
namespace routing {
namespace node_creator {
void GetPbNode(const hdmap::Lane& lane, const std::string& road_id,const RoutingConfig& routingconfig, Node* const node);
} // namespace node_creator
} // namespace routing
} // namespace apollo
-
使用生成的类:
在代码中,你可以像使用普通类一样使用生成的 Protobuf 类。例如,使用 C++:
#include "graph.pb.h" void Example() {Graph graph;Node* node = graph.add_node();node->set_lane_id("lane_123");node->set_road_id("road_456");// 设置其他字段...// 序列化为二进制std::string binary_data;graph.SerializeToString(&binary_data);// 反序列化Graph new_graph;new_graph.ParseFromString(binary_data); }
1proto文件中的关键字
在 Protocol Buffers(Protobuf)中,repeated
是一个关键字,用于定义一个可以包含零个或多个指定类型元素的字段。具体到您提到的 repeated Node node
,它的含义如下:
repeated Node node
的含义
repeated
:这是 Protobuf 中的一个修饰符,表示该字段可以出现多次,类似于数组、列表或集合。Node
:这是一个自定义的消息类型(即另一个message
定义),表示每个元素的类型。node
:这是字段的名称,用于在代码中访问该字段。
示例 .proto
文件
以下是一个完整的 .proto
文件示例,展示了如何使用 repeated
关键字:
syntax = "proto3";message Node {string lane_id = 1;string road_id = 2;// 其他字段...
}message Graph {repeated Node node = 1; // 这是您提到的行// 其他字段...
}
repeated
字段的作用
使用 repeated
声明的字段允许在一个消息中包含多个相同类型的元素。在上述示例中,Graph
消息可以包含多个 Node
元素。这样设计的好处包括:
- 灵活性:可以根据需要添加任意数量的
Node
元素,而不需要预先定义具体的数量。 - 动态扩展:在序列化和反序列化过程中,Protobuf 会自动处理这些重复的元素,使得数据交换更加高效和简洁。
生成代码中的 repeated
字段
当使用 protoc
编译器根据 .proto
文件生成代码时,repeated
字段会生成一组专门的方法,用于操作这些重复的元素。以下以 C++ 为例,说明 repeated Node node
会生成哪些方法:
class Graph : public ::google::protobuf::Message {
public:// 获取 node 的数量int node_size() const;// 获取指定索引的 Nodeconst Node& node(int index) const;Node* mutable_node(int index);// 添加一个新的 NodeNode* add_node();// 获取所有 Node 的只读引用const ::google::protobuf::RepeatedPtrField<Node>& node() const;// 获取所有 Node 的可变引用::google::protobuf::RepeatedPtrField<Node>* mutable_node();// 清除所有 Nodevoid clear_node();// 其他 Protobuf 生成的方法...
};
各方法的作用
-
int node_size() const;
- 返回
node
字段中Node
元素的数量。
- 返回
-
const Node& node(int index) const;
- 返回指定索引处的
Node
元素的只读引用。
- 返回指定索引处的
-
Node* mutable_node(int index);
- 返回指定索引处的
Node
元素的可变引用,允许修改该元素。
- 返回指定索引处的
-
Node* add_node();
- 在
node
字段末尾添加一个新的Node
元素,并返回该新元素的可变引用。
- 在
-
const ::google::protobuf::RepeatedPtrField<Node>& node() const;
- 返回
node
字段中所有Node
元素的只读引用,通常用于遍历。
- 返回
-
::google::protobuf::RepeatedPtrField<Node>* mutable_node();
- 返回
node
字段中所有Node
元素的可变引用,允许批量修改。
- 返回
-
void clear_node();
- 清除
node
字段中所有的Node
元素。
- 清除
使用示例
以下是一个使用生成的 Graph
类操作 repeated Node node
字段的示例:
#include "graph.pb.h" // 生成的 Protobuf 头文件void Example() {Graph graph;// 添加一个新的 NodeNode* node1 = graph.add_node();node1->set_lane_id("lane_123");node1->set_road_id("road_456");// 添加另一个 NodeNode* node2 = graph.add_node();node2->set_lane_id("lane_789");node2->set_road_id("road_012");// 获取 Node 的数量int count = graph.node_size();std::cout << "Number of nodes: " << count << std::endl;// 遍历所有 Nodefor (int i = 0; i < graph.node_size(); ++i) {const Node& node = graph.node(i);std::cout << "Node " << i << ": lane_id = " << node.lane_id()<< ", road_id = " << node.road_id() << std::endl;}// 清除所有 Nodegraph.clear_node();
}
总结
repeated
关键字:用于定义可以包含多个相同类型元素的字段,类似于数组或列表。- 自动生成的方法:Protobuf 根据
repeated
字段生成一系列方便操作的方法,如add_node()
,node_size()
,node(int index)
等。 - 灵活性和效率:
repeated
字段提供了高度的灵活性,允许动态添加和管理多个元素,同时保持高效的序列化和反序列化性能。
如果您有更多关于 Protobuf 或 repeated
字段的具体问题,请随时提问!
相关文章:
Proto文件相关知识
百度Apollo的数据结构常用proto文件来定义, proto文件允许你以类似于C结构体或类的方式定义数据结构。你可以在这个文件中定义简单数据类型、枚举、消息类型等。 基于proto文件,Protocol Buffers编译器(protoc)可以自动生成对应的…...
k8s的控制节点不能访问node节点容器的ip地址
master控制node服务器添加容器后,访问不了该node服务器容器的ip,只能在node服务器访问 排查后发现是k8s的master服务器和node节点的网址网段和k8s初始化时提示的ip网段不一致 我之前是192.168.137.50, 实际上master主机期望的是192.168.1.50 解决方案: 1.删除服务器后重建ma…...
鸿蒙OpenHarmony
开源鸿蒙系统编译指南 Ubuntu编译环境配置第一步:Shell 改 Bash第二步:安装Git和安装pip3工具第三步:远程仓配置第四步:拉取代码第五步:安装编译环境第六步:本地编译源码 Windows开发环境配置第一步&#x…...
把白底照片变蓝色用什么软件免费 批量更换证件照底色怎么弄
作为专业的修图师,有时候也会接手证件照修图和换底色工作,这种情况下,需要换底色的照片也许达到上百张。为了提高工作效率,一般需要批量快速修图,那么使用什么软件工具能够给各式不同的照片批量更换背景色呢࿱…...
Spring之生成Bean
Bean的生命周期:实例化->属性填充->初始化->销毁 核心入口方法:finishBeanFactoryInitialization-->preInstantiateSingletons DefaultListableBeanFactory#preInstantiateSingletons用于实例化非懒加载的bean。 1.preInstantiateSinglet…...
笔记整理—linux进程部分(6)进程间通信、alarm和pause
两个进程间通信可能是任何两个进程间的通信(IPC)。同一个进程是在同一块地址空间中的,在不同的函数与文件以变量进程传递,也可通过形参传递。2个不同进程处于不同的地址空间,要互相通信有难度(内存隔离的原…...
Java网络通信—UDP
0.小记 1.udp通信不需要建立socket管道,一边只管发,一边只管收 2.客户端:将数据(byte)打包成包裹(DatagramPacket),写上地址(IP端口),通过快递站&…...
k8s架构,从clusterIP到光电半导体,再从clusterIP到企业管理
clusterIP作为k8s中的服务, 也是其他三个服务的基础 ~]$ kubectl create service clusterip externalname loadbalancer nodeport 客户端的流量到service service分发给pod,pod由控制器自动部署,自动维护 那么问题是service的可用…...
vue框架和uniapp框架区别
文章目录 vue框架和uniapp框架区别一、引言二、Vue.js 概述1、Vue.js 简介1.1、特点 2、适用场景 三、Uni-app 概述1、Uni-app 简介1.1、特点 2、适用场景 四、区别与比较1、跨平台能力2、开发体验3、性能优化4、社区和支持 五、总结 vue框架和uniapp框架区别 一、引言 在前端…...
828华为云征文 | 华为云Flexus云服务器X实例搭建Zabbix网络设备监视系统(Ubuntu服务器运维)
前言 Flexus X实例内嵌智能应用调优算法,性能强悍,基础模式GeekBench单核及多核跑分可达同规格独享型实例的1.6倍,性能模式更是超越多系列旗舰型云主机,为企业业务提供强劲动力。 💼 Flexus X Zabbix:打造…...
JAVA基础-线程(Thread)、多线程(Multi-threaded)
1、知识铺垫 要想了解什么是线程,首先要搞明白线程与进程的区别,并行与并发的区别 1.1 线程与进程 进程:是指⼀个内存中运⾏的应⽤程序,每个进程都有⼀个独⽴的内存空间,⼀个应⽤程序可以同时运⾏多个进程;…...
hystrix微服务部署
目录 一.启动nacos和redis 1.查看是否有nacos和redis 二.开始项目 1.hystrix1工程(修改一下工程的注册名字) 2.运行登录nacos网站查看运行效果(默认密码nacos,nacos) 3.开启第二个项目 hystrix2工程 4.关闭第二个项目 hyst…...
使用百度文心智能体创建多风格表情包设计助手
文章目录 一、智能定制,个性飞扬二、多元风格,创意无限 百度文心智能体平台为你开启。百度文心智能体平台,创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台,集成了先进的自然语言处理技术和人工智能技术&…...
【嵌入式裸机开发】智能家居入门3(MQTT服务器、MQTT协议、微信小程序、STM32)
前面已经写了两篇博客关于智能家居的,服务器全都是使用ONENET中国移动,他最大的优点就是作为数据收发的中转站是免费的。本篇使用专门适配MQTT协议的MQTT服务器,有公用的,也可以自己搭建 前言一、项目总览二、总体流程分析1、了解…...
css的背景background属性
CSS的background属性是一个简写属性,它允许你同时设置元素的多个背景相关的子属性。使用这个属性可以简化代码,使其更加清晰和易于维护。background属性可以设置不同的子属性。 background子属性 定义背景颜色 使用background-color属性 格式&#x…...
Cypress自动化测试实战:构建高效的前端测试体系
在快速迭代的软件开发环境中,前端自动化测试是保证代码质量和用户体验的重要手段。Cypress作为一款功能强大的前端自动化测试工具,凭借其丰富的特性、直观的API和高效的测试执行速度,赢得了众多开发者和测试团队的青睐。本文将深入探讨Cypres…...
【YOLO学习】YOLOv2详解
文章目录 1. 概述2. Better2.1 Batch Normalization(批归一化)2.2 High Resolution Classifier(高分辨率分类器)2.3 Convolutional With Anchor Boxes(带有Anchor Boxes的卷积)2.4 Dimension Clusters&…...
windows 录音编码为flv格式时,pcm采样格式
这里使用的是0x3e,转换为二进制: 0 0 1 1 1 1 1 0 前四个字节为3,表示Linear Pcm, 后4个字节1 1 1 0 表示44100HZ采样, 16个bit,单声道。 故,windows 音频采样不支持48000HZ频率...
Qt开发技巧(九)去掉切换按钮,直接传样式文件,字体设置,QImage超强,巧用Qt的全局对象,信号槽断连,低量数据就用sqlite
继续讲一些Qt开发中的技巧操作: 1.去掉切换按钮 QTabWidget选项卡有个自动生成按钮切换选项卡的机制,有时候不想看到这个烦人的切换按钮,可以设置usesScrollButtons为假,其实QTabWidget的usesScrollButtons属性最终是应用到QTabWi…...
51c自动驾驶~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/11466109 #HTCL 超过所有视觉方案!HTCL:分层时间上下文问鼎OCC 本文是对ECCV2024接受的文章 HTCL: 的介绍,HTCL在SemanticKITTI基准测试中超过了所有基于相机的方法,甚至在和…...
Star 3w+,向更安全、更泛化、更云原生的 Nacos3.0 演进
作者:席翁 Nacos 社区刚刚迎来了 Star 突破 30000 的里程碑,从此迈上了一个新的阶段。感谢大家的一路支持、信任和帮助! Nacos /nɑ:kəʊs/是 Dynamic Naming and Configuration Service 的首字母简称,定位于一个更易于构建云原…...
PHP魔幻(术)方法
PHP中的魔幻方法,也被称为魔术方法(Magic Methods),是一组具有特殊功能的方法。这些方法在PHP中有固定的名称,并且会在特定的时机自动被PHP调用,而无需开发者显式调用。它们通常用于执行一些特殊的操作&…...
VS开发 - 静态编译和动态编译的基础实践与混用
目录 1. 基础概念 2. 直观感受一下静态编译和动态编译的体积与依赖项目 3. VS运行时库包含哪些主要文件(从VS2015起) 4. 动态库和静态库混用的情况 5. 感谢清单 1. 基础概念 所谓的运行时库(Runtime Library)就是WINDOWS系统…...
Golang | Leetcode Golang题解之第451题根据字符出现频率排序
题目: 题解: func frequencySort(s string) string {cnt : map[byte]int{}maxFreq : 0for i : range s {cnt[s[i]]maxFreq max(maxFreq, cnt[s[i]])}buckets : make([][]byte, maxFreq1)for ch, c : range cnt {buckets[c] append(buckets[c], ch)}an…...
零信任如何增强网络物理系统 (CPS) 安全性
远程访问对于管理关键基础设施至关重要,因为它允许企业优化和扩展运营并保持效率。然而,它也带来了许多安全漏洞,而且随着连接设备数量的增加,这些漏洞只会越来越多。 到 2025 年,企业和消费者环境中的物联网设备数量…...
V3D——从单一图像生成 3D 物体
导言 论文地址:https://arxiv.org/abs/2403.06738 源码地址:https://github.com/heheyas/V3D.git 人工智能的最新进展使得自动生成 3D 内容的技术成为可能。虽然这一领域取得了重大进展,但目前的方法仍面临一些挑战。有些方法速度较慢&…...
计算机网络期末复习真题(附真题答案)
前言: 本文是笔者在大三学习计网时整理的笔记,哈理工的期末试题范围基本就在此范畴内,就算真题有所更改,也仅为很基础的更改数值,大多跑不出这些题,本文包含简答和计算等大题,简答的内容也可能…...
Unity 的 UI Event System 是一个重要的框架
Unity 的 UI Event System 是一个重要的框架,用于处理用户界面中的输入事件。以下是它的主要特点和功能: 1. 事件管理 UI Event System 负责捕获和管理来自用户的输入事件,如鼠标点击、触摸、键盘输入等。 2. 事件传播 事件通过层次结…...
第十三章 集合
一、集合的概念 集合:将若干用途、性质相同或相近的“数据”组合而成的一个整体 Java集合中只能保存引用类型的数据,不能保存基本类型数据 数组的缺点:长度不可变 Java中常用集合: 1.Set(集):集合中的对象不按特定方式排序&a…...
子非线程池中物
线程池,又好上了 有任务队列 任务要处理就直接放到里面 预先创建好线程,本质上也是一个生产消费模型 线程池真是麻烦啊 我们可以直接沿用之前写过的代码,Thread.hpp: #pragma once #include <iostream> #include <functional&…...
小学学校网站建设方案/百度推广关键词多少合适
微信小程序开发:第七天 本来今天是要学习组件的,但是我感觉我写的不如官网写的,所以就不写了,大家可以看下官网的,组件。 我就在这里列举一下组件列表: 视图容器: viewscroll-viewswiper基础内容…...
小型视频网站建设/如何自己制作网站
目录:华为初级证书-HCIA(HCNA)-R&S(Routing & Switching) 随着Internet的发展和网络应用的增多,有限的IPv4公有地址已经成为制约网络发展的瓶颈。为解决这个问题,NAT(Network Address Translation&…...
建设什么网站/seo文章
神经网络实现身份证号码数字分割及识别技术 身份证号码是我们日常生活中经常用到的一种重要证件,但是身份证号码格式固定,位数较多,不同的位置表示的含义也不一样,因此需要对身份证号码进行数字分割和识别。在传统的方法中&#…...
重庆妇科医院排名前十/百度seo提高排名费用
Firefox - 附加软件 - Firebug - DOM文档结构视图 - “冻结”被AJAX不断更新的DOM视图 当页面中包含定期执行的AJAX脚本时,DOM视图将自动刷新,不便于查看,此时可以在script视图中AJAX脚本处设置断点,这样DOM视图就被“冻结”了。…...
网站安全建设总结/宣传推广网络推广
编辑选择结果 操作 实例 效果 备注 添加 添加选择器 $("p").add(".a") 添加类名为a的选择器 并不影响源结果集 $("p").add( "label", $(".class") ); 添加类包含名为class的所有label元素的选择器 添加ht…...
图书馆主题 wordpress/百度收录入口
随着物联网产业的深入发展,物联网发展到一定规模后,在物理资源层与云计算结合是水到渠成。一部分物联网行业应用,如智能电网、地震台网监测等,终 端数量的规模化导致物联网应用对物理资源产生了大规模需求,一个是接入终…...