【Protobuf速成指南】Any类型的使用

news2024/11/25 8:15:40

文章目录

  • 2.2 Any类型的使用
    • 一、基本认识
    • 二、使用需知
    • 三、Any字段的使用
      • ①修改proto文件
      • ② Any相关函数
      • ③ 类型转换
    • 四、Contact 2.2 改写

2.2 Any类型的使用

 本系列文章将通过对通讯录项目的不断完善,带大家由浅入深的学习Protobuf的使用。这是Contacts的2.2版本,在这篇文章中将带大家学习Protobuf的 Any 类型语法,并将其用到我们的项目中

一、基本认识

 Protobuf中的Any类型可以理解为泛型类型,它可以存储任何消息类型的字段(int, char等类型必须先封装成消息类型)。Any类型字段也可以用 Repeated 修饰。

 Any类型定义在 any.proto 文件中。可以在 /usr/local 路径下可以找到。我在安装的时候将 lib 和 include 统一配置到 /usr/local/protobuf 文件中。如果没有配置的话,lib和include是分散的。

image-20230608113140552

二、使用需知

①头文件的包含:

image-20230608113635069

使用Any字段前首先需要包含头文件,先前做过的环境变量配置如上

  • 因此可以如下包含头文件

    image-20230608113832834

  • 引入 any.proto 文件

    image-20230608115147745

②命名空间:gooole::protobuf

image-20230608114030513

三、Any字段的使用

①修改proto文件

我们先创建一个Address消息字段,并在 PeopleInfo 消息中用Any类型字段接收

syntax = "proto3";
package contact2;

import "google/protobuf/any.proto";

message Address{
    string home = 1;
    string company = 2;
}

message PeopleInfo{
    string name = 1;
    int32 age = 2;
    message Phone{   
        string number = 1;
        enum PhoneType{
            MOBILE = 0;
            FIXED = 1;
        }
        PhoneType type = 2;
    }
    repeated Phone phone = 3;
    google.protobuf.Any addr = 4;
}

message Contact{
    repeated PeopleInfo contact = 1;
}

② Any相关函数

编译 .proto 文件后,我们来分析 contacts.pb.h 文件中对于Any类型更新的代码片段

// [作用]:判断Any字段addr是否被设置
bool has_addr() const;


// [作用]:清除对Any字段的设置(重置为默认值)
void clear_addr();


// [作用]:返回Any字段的内容
const ::PROTOBUF_NAMESPACE_ID::Any& addr() const;


// [作用]:用于获取Any消息中的 addr 成员变量,并返回一个指向 addr 的指针,可以通过这个指针修改该Any对象中 addr
::PROTOBUF_NAMESPACE_ID::Any* mutable_addr();
// [注意]:在使用 mutable_addr() 方法获取指针之前,需要确定该 Any 字段中存储的值已经被正确地解析为具体的类型,否则直接使用 mutable_addr() 可能会导致程序崩溃或者其他不可预知的问题


 // [作用]:释放 Any 对象中包含的数据(Any字段里的内容被重置为默认值),并返回一个指向释放数据的指针。也就是将该对象的所有权转移给调用方
 PROTOBUF_NODISCARD ::PROTOBUF_NAMESPACE_ID::Any* release_addr();
// [注意]:该方法所释放的是 Any 类型对象中存储的对象的所有权,而非 Any 类型对象本身的所有权。

③ 类型转换

 前面提到,Any字段中可以存储任意消息类型,这就要涉及到任意消息类型和Any类型的互转。这部分代码就在Google为我们写好的头文件 any.pb.h 中。

// 将任意消息类型转为Any类型
bool PackFrom(const ::PROTOBUF_NAMESPACE_ID::Message& message)
    
// 将Any类型转为任意消息类型
bool UnpackTo(::PROTOBUF_NAMESPACE_ID::Message* message) const
    
// 判断 Any 字段存储的对象类型是否为 T
template<typename T> bool Is() const

四、Contact 2.2 改写

write.cc:

image-20230609170144152

read.cc:

image-20230609172755758

区分下面的写法:

image-20230609171944727

🎯[说明]:

  • 正确:addr返回的是const对象。const对象才能调用const修改的函数
  • 错误:mutable_addr的对象是可以修改

image-20230609171849058

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/627881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于脑电功率的疲劳驾驶检测研究_kaic

基于脑电功率的疲劳驾驶检测研究 摘 要 在道路交通安全领域&#xff0c;疲劳驾驶是一种常见的交通安全隐患。现有数据统计&#xff0c;全球每年有大约&#xff12;&#xff11;&#xff05;的重大交通事故与疲劳驾驶有关&#xff0c;疲劳驾驶成为了诱发交通事故的主要原因之一…

多模态深度学习:定义、示例、应用

人类使用五种感官来体验和解读周围的世界。我们的五种感官从五个不同的来源和五种不同的方式捕捉信息。模态是指某事发生、经历或捕捉的方式。 人脑由可以同时处理多种模式的神经网络组成。想象一下进行对话——您大脑的神经网络处理多模式输入&#xff08;音频、视觉、文本、…

《树莓派4B家庭服务器搭建指南》第十六期:安装Calibre Web建立公网可访问私人电子书库

最近在整理收藏的电子书&#xff0c;以便在公网可以随时访问自己的电子书&#xff0c;然而&#xff0c;Calibre桌面端虽然功能强大&#xff0c;并且可以开启本地http服务&#xff0c;但http的界面还是过于简陋 我发现了一个Calibre Web开源项目&#xff0c;界面也非常舒服&…

STM32F407实现1588v2(ptpd)

硬件&#xff1a; STM32F407ZGT6开发板 软件&#xff1a; VSCode arm-none-eabi-gcc openOCD st-link 在github搜到一个在NUCLEO-F429ZI开发板上移植ptpd的example&#xff0c;因为和F407差别很小&#xff0c;所以就打算用这个demo移植到手头的开发板上。因为目前只需要…

mysql中将字符123转变成1.2.3

具体业务需求&#xff1a;因为需求变更&#xff0c;之前存储数值型字符串&#xff0c;现需要将数值型转变为x.x.x update mpc_mp_package a join (select(selectGROUP_CONCAT(SUBSTRING(mp_ver, number, 1) separator .) as separated_stringfrom(selecti : i 1 as numberfro…

别再等了,这就是ping通上不了网的解决办法

ip能ping通&#xff0c;但是就是无法上网&#xff0c;应该大部分网工都遇到过这种情况吧。 能ping通&#xff0c;说明ip是能够和网络设备通信的&#xff0c;但是上不了网&#xff0c;就要具体问题具体分析了。 今天聊点基础的&#xff0c;ip能ping通但是上不了网&#xff0c;到…

百分点科技出席2023华为云TechWave中东中亚峰会

6月7日&#xff0c;2023华为云TechWave中东中亚峰会在哈萨克斯坦阿拉木图举办&#xff0c;百分点科技作为华为云生态合作伙伴出席活动&#xff0c;联合发布系列智能化解决方案&#xff0c;百分点科技CTO刘译璟进行主题分享。 刘译璟&#xff08;右二&#xff09;参与联合解决方…

RocketMQ集群部署

一、部署环境 两台服务器&#xff0c;每台一个nameserver构成集群&#xff0c;broker集群双主双从。 主机 容器名称 IP 与宿主机的端口映射 ODL控制器会同过vip通道10909去连接mq。主从通过10912端口同步这两个地址是通过-2 1 在配置文件端口10911基础上计算得出 两个宿主机…

高速信号的 pre-emphasis 预加重和 de-emphasis去加重

1 为何需要 emphasis &#xff1f; 预加重和去加重其实属于高速信号均衡技术的一种&#xff0c;均衡技术又叫信号补偿技术。 信号从发送端发出&#xff0c;经信道传输&#xff0c;到达接收端。在传输过程中&#xff0c;信号会发生失真&#xff0c;影响接收端对信号的正确判决。…

项目构建与部署

项目构建与部署 Jar部署War部署1&#xff0e;修改打包形式2&#xff0e;排除内置的Tomcat容器3&#xff0e;添加servlet-api依赖4&#xff0e;修改启动类 项目可以内嵌Servlet容器&#xff0c;因此部署极为方便&#xff0c;可直接打包成可执行Jar包部署在有Java运行环境的服务器…

BurpSuite2023测试越权漏洞

BurpSuite2023测试越权漏洞 BurpSuite安装创建项目 - 打开内置浏览器越权漏洞测试问题处理 BurpSuite安装 官网下载社区版并安装&#xff0c;下载地址&#xff1a;链接: https://portswigger.net/burp 安装成功后图标 创建项目 - 打开内置浏览器 打开BurpSuite&#xff0c…

uni-app打包ios的步骤

注意&#xff1a;下面的操作必须同时满足三个条件&#xff0c;且这三个条件都是必须得&#xff1a; 1.有一个苹果开发者账号(要收费) 2.有一台苹果笔记本(在笔记本上生成证书和文件) 3.有一部苹果手机(用于测试app的功能) 使用uniapp发布ios的应用的步骤如下&#xff1a; 点击发…

Lecture 14 Context-Free Grammar

目录 Context-Free GrammarBasics of Context-Free GrammarsCFG Parsing ConstituentsSyntactic ConstituentsConstituents and PhrasesExample: A Simple CFG for English and generating sentencesCFG Trees CYK AlgorithmCYK AlgorithmConvert to Chomsky Normal FormThe CY…

影响电磁铁磁力大小的因素有哪些

影响电磁铁磁力大小的因素主要有四个&#xff0c;一是缠绕在铁芯上线圈的圈数&#xff0c;二是线圈中电流的强度&#xff0c;三是缠绕的线圈与铁芯的距离&#xff0c;四是铁芯的大小形状。 首先要了解电磁铁的磁性是如何产生的&#xff0c;通电螺线管的磁场&#xff0c;由毕奥&…

C#程序设计实验

C#实验 实验1 C# 基本编程 题目 VS下新建一个控制台项目&#xff1a;诸如&#xff1a;hello world程序&#xff0c;运行程序输出结果。并解释C#程序的结构&#xff1a; 诸如&#xff1a;一个基本的C#程序包含几部分 &#xff0c;每一部分的功能是什么。。。 完整代码 usin…

YAPI接口自动化测试该如何正确地操作

目录 前言&#xff1a; 1、它首先是一个很好的接口维护的工具&#xff1b; 2、单个接口测试时&#xff0c;更方便灵活&#xff0c;更易用&#xff1b; 3、接口自动化测试&#xff0c;可以0代码基础进行接口集合的测试&#xff1b; 前言&#xff1a; YAPI是一款易于使用、可…

Lecture 15 Probabilistic Context-Free Grammar

目录 Ambiguity in Parsing Basics of PCFGsBasics of PCFGsStochastic Generation with PCFGs PCFG ParsingCYK for PCFGs Limitations of CFGPoor Independence AssumptionsLack of Lexical Conditioning Ambiguity in Parsing Context-Free grammars assign hierarchical st…

OpenELB 在 CVTE 的最佳实践

作者&#xff1a;大飞哥&#xff0c;视源电子股份运维工程师&#xff0c; KubeSphere 社区用户委员会广州站站长&#xff0c;KubeSphere Ambassador。 公司介绍 广州视源电子科技股份有限公司&#xff08;以下简称视源股份&#xff09;成立于 2005 年 12 月&#xff0c;旗下拥…

最详细整理,HttpRunner接口自动化框架Hook机制详解(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 httprunner 4.x可…

软体机器人,刚柔软机器人仿真建模,干货满满,直接上图!

一、 背景&#xff1a; 软体机器人技术是近年来机器人领域最为热门的研究领域之一。软体机器人具有天然的柔 性、自适应性、低成本和被动安全性&#xff0c;在人机交互、医疗服务等领域具有广泛的应用前景。同时&#xff0c; 软体机器人的研究涉及软材料、机构设计、仿生学、微…