google::protobuf命名空间下常用的C++ API----message.h

news2024/11/18 20:20:00

#include <google/protobuf/message.h>

namespace google::protobuf

    假设您有一个消息定义为:

message Foo {
  optional string text = 1;
  repeated int32 numbers = 2;
}

    然后,如果你使用 protocol编译器从上面的定义生成一个类,你可以这样使用它:

std::string data;  // Will store a serialized version of the message.

{
  // Create a message and serialize it.
  Foo foo;
  foo.set_text("Hello World!");
  foo.add_numbers(1);
  foo.add_numbers(5);
  foo.add_numbers(42);

  foo.SerializeToString(&data);
}

{
  // Parse the serialized message and check that it contains the
  // correct data.
  Foo foo;
  foo.ParseFromString(data);

  assert(foo.text() == "Hello World!");
  assert(foo.numbers_size() == 3);
  assert(foo.numbers(0) == 1);
  assert(foo.numbers(1) == 5);
  assert(foo.numbers(2) == 42);
}

{
  // Same as the last block, but do it dynamically via the Message
  // reflection interface.
  Message* foo = new Foo;
  const Descriptor* descriptor = foo->GetDescriptor();

  // Get the descriptors for the fields we're interested in and verify
  // their types.
  const FieldDescriptor* text_field = descriptor->FindFieldByName("text");
  assert(text_field != nullptr);
  assert(text_field->type() == FieldDescriptor::TYPE_STRING);
  assert(text_field->label() == FieldDescriptor::LABEL_OPTIONAL);
  const FieldDescriptor* numbers_field = descriptor->
                                         FindFieldByName("numbers");
  assert(numbers_field != nullptr);
  assert(numbers_field->type() == FieldDescriptor::TYPE_INT32);
  assert(numbers_field->label() == FieldDescriptor::LABEL_REPEATED);

  // Parse the message.
  foo->ParseFromString(data);

  // Use the reflection interface to examine the contents.
  const Reflection* reflection = foo->GetReflection();
  assert(reflection->GetString(*foo, text_field) == "Hello World!");
  assert(reflection->FieldSize(*foo, numbers_field) == 3);
  assert(reflection->GetRepeatedInt32(*foo, numbers_field, 0) == 1);
  assert(reflection->GetRepeatedInt32(*foo, numbers_field, 1) == 5);
  assert(reflection->GetRepeatedInt32(*foo, numbers_field, 2) == 42);

  delete foo;
}

    这个文件中的类

    Metadata:用于保存消息元数据的容器。
    Message:协议消息的抽象接口。   
    Reflection:此接口包含可用于动态访问和修改协议消息字段的方法。
    MessageFactory:消息对象工厂的抽象接口。

    文件成员

    以下定义不是任何类的一部分。
   

 //尝试将此消息向下转换为生成的消息类型
template const T *  DynamicCastToGenerated(const Message * from)
template T * DynamicCastToGenerated(Message* from)
   
//调用此函数以确保此消息的反射被链接到二进制文件
template void  LinkMessageReflection ()   

//调用方式
google::protobuf::LinkMessageReflection<FooMessage>();

//这将确保以下查找成功:
DescriptorPool::generated_pool()->FindMessageTypeByName("FooMessage");
const RepeatedPtrField< std::string > &	
Reflection::GetRepeatedPtrFieldInternal< std::string >(const Message & message, const FieldDescriptor * field) const
RepeatedPtrField< std::string > *	
Reflection::MutableRepeatedPtrFieldInternal< std::string >(Message * message, const FieldDescriptor * field) const

结构元数据

#include <google/protobuf/message.h>

namespace  google::protobuf

用于保存消息元数据的容器。

//成员:
const Descriptor *	descriptor
const Reflection *	reflection

   class Message: public MessageLite

#include <google/protobuf/message.h>

namespace  google::protobuf

协议消息的抽象接口。

    另请参见MessageLite,它包含大多数日常操作,Message类在此基础上添加了描述符(descriptors)和反射reflection()。

    用户不能从这个类派生。只有protocol编译器和内部库允许创建子类。

constexpr	Message()
protected virtual Metadata
//获取一个包含消息元数据的结构体,该结构体依次用于实现上面的GetDescriptor()和GetReflection()。	
GetMetadata() const = 0
protected explicit	Message(Arena * arena)
protected static uint64	GetInvariantPerBuild(uint64 salt)
//基本操作

//Construct a new instance of the same type.
virtual Message * New() const = 0

//Construct a new instance on the arena. 
virtual Message *	New(Arena * arena) const

//Make this message into a copy of the given message. 
virtual void CopyFrom(const Message & from)

//Merge the fields from the given message into this message. 
virtual void MergeFrom(const Message & from)

//Verifies that IsInitialized() returns true. 
void	CheckInitialized() const

//Slowly build a list of all required fields that are not set. more...
void	FindInitializationErrors(std::vector< std::string > * errors) const

//Like FindInitializationErrors, but joins all the strings, delimited by commas, and //returns them.
virtual std::string	InitializationErrorString() const

//Clears all unknown fields from this message and all embedded messages. 
virtual void	DiscardUnknownFields()

//Computes (an estimate of) the total number of bytes currently used for storing the //message in memory. 
virtual size_t	SpaceUsedLong() const

int	SpaceUsed() const

调试和测试

//Generates a human readable form of this message, useful for debugging and other purposes.
std::string	DebugString() const

//Like DebugString(), but with less whitespace.
std::string	ShortDebugString() const

//Like DebugString(), but do not escape UTF-8 byte sequences.
std::string	Utf8DebugString() const

//Convenience function useful in GDB. Prints DebugString() to stdout.
void PrintDebugString() const

基于反射的方法

    这些方法在MessageLite中是纯虚拟的,但是Message提供了基于反射的默认实现。

//Get the name of this message type, e.g. "foo.bar.BazProto".
virtual std::string	GetTypeName() const

//Clear all fields of the message and set them to their default values. 
virtual void Clear()

//Returns whether all required fields have been set. 
virtual bool IsInitialized() const

//If |other| is the exact same class as this, calls MergeFrom(). more...
virtual void CheckTypeAndMergeFrom(const MessageLite & other)

//Reflective parser.
virtual const char * _InternalParse(const char * ptr, internal::ParseContext * ctx)

//Computes the serialized size of the message. 
virtual size_t ByteSizeLong() const

//Fast path when conditions match 
virtual uint8 *	_InternalSerialize(uint8 * ptr, io::EpsCopyOutputStream * stream) const

//自省

//Get a non-owning pointer to a Descriptor for this message's type. 
const Descriptor *	GetDescriptor() const

//Get a non-owning pointer to the Reflection interface for this Message, which can be used to read and modify the fields of the Message dynamically (in other words, without knowing the message type at compile time). 
const Reflection *	GetReflection() const

Reflection类

    #include <google/protobuf/message.h>

    命名空间google::protobuf

    此接口包含可用于动态访问和修改协议消息字段的方法。

    它们的语义类似于protocol编译器生成的访问器。

    要获取给定消息的反射,请调用Message:: getrereflect()。

    该接口与Message分离只是出于效率的考虑;Message的绝大多数实现将共享相同的Reflection实现(GeneratedMessageReflection,在generated_message.h中定义),并且特定类的所有消息应该共享相同的Reflection对象。

    这些方法有几种不正确的使用方式。例如,以下任何条件都会导致未定义的结果:

    FieldDescriptor不是此消息类型的字段。
    所调用的方法不适合字段的类型。对于FieldDescriptor::TYPE_*中的每个字段类型,只有一个Get*()方法、一个Set*()方法和一个Add*()方法对该类型有效。
    在重复字段上调用单个字段的Get*()或Set*()方法。
    在非重复字段上调用GetRepeated*(), SetRepeated*()或Add*()。
    传递给任何方法的Message对象都不是这个Reflection对象的正确类型(即Message . getreflection () != Reflection)。

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

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

相关文章

跳妹儿学编程之ScratchJr(7):动作积木篇—爸爸去散步

引言 在之前的文章中&#xff0c;我们共同踏出了使用ScratchJr编程的第一步。现在&#xff0c;我们对ScratchJr已经有了初步的认识。今天&#xff0c;我们将正式启程&#xff0c;深入探索ScratchJr的编程世界。我们将逐一学习并实践每一种类型的指令&#xff08;积木块&#x…

基于uniapp(Vue3)自定义开发云闪付小程序

云闪付小程没有类似微信或支付宝小程序那样自己的框架&#xff0c;本质是开发一个H5&#xff0c;部署到自己的服务器上&#xff0c;然后在云闪付小程序平台配置首页链接。开发的H5要保证能使用官方的SDK和组件库。 项目基础配置 将以下代码配置入package.json "uni-app…

Navicat Premium16 解锁版安装教程,亲测可用!

前言 “Navicat”是一套可创建多个连接的数据库管理工具&#xff0c;用以方便管理 MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB 和/或 MongoDB 等不同类型的数据库&#xff0c;并支持管理某些云数据库。Navicat 的功能足以符合专业开发人员的所有需求&#xff0c…

Spring 泛型依赖注入

Spring 泛型依赖注入&#xff0c;是利用泛型的优点对代码时行精简&#xff0c;将可重复使用的代码全部放到一个类之中&#xff0c;方便以后的维护和修改&#xff0c;同时在不增加代码的情况下增加代码的复用性。 示例代码&#xff1a; 创建实体类 Product package test.spri…

2024年APMCP亚太杯中文赛B题完整解析 | 代码与论文分享

B题 洪水灾害的数据分析与预测 解题思路问题一问题二问题三问题四 论文问题一2.1 Kolmogorov-Smirnov分布检验模型的建立与求解2.2 基于斯皮尔曼相关系数的相关性检验 代码问题一Q1_1.mQ1_2.mQ1_3.m &#xff08;后续资料更新 关注公众号 云顶数模 领取相关资料&#xff09; 解…

Twitter API接口教程编程指南!如何使用?

Twitter API接口教程怎么用&#xff1f;如何高效利用API接口发信&#xff1f; 无论是为了分析趋势、构建自动化工具&#xff0c;还是开发社交媒体应用&#xff0c;掌握Twitter API接口是至关重要的。AokSend将详细介绍Twitter API接口教程的相关内容&#xff0c;帮助您快速上手…

【网络安全】第3讲 消息认证技术(笔记)

一、认证技术概述 1、网络常见攻击 2、对信息网络安全的攻击有&#xff08;两种类型&#xff09; &#xff08;1&#xff09;被动攻击 —— 加密技术 通过侦听和截取手段获取数据 &#xff08;2&#xff09;主动攻击 —— 认证技术 通过伪造、重放、篡改、乱序等手段改变数据…

“谋士三国”诸葛亮的锦囊妙计 - 策略模式

“当代码如三国&#xff0c;智慧如孔明&#xff0c;何愁天下设计不归一统&#xff1f;” 乱世之中&#xff0c;英雄辈出。三国的战场上&#xff0c;不仅刀光剑影&#xff0c;更有智慧的较量。诸葛亮的锦囊妙计&#xff0c;不正是今日软件设计中策略模式的完美写照吗&#xff1…

五、框架实战:SSM整合原理和实战-个人版

五、框架实战&#xff1a;SSM整合原理和实战 文章目录 五、框架实战&#xff1a;SSM整合原理和实战一、SSM整合理解1.1 什么是SSM整合&#xff1f;1.2 SSM整合核心问题明确1.2.1 第一问&#xff1a;SSM整合需要几个IoC容器&#xff1f;1.2.2 第二问&#xff1a;每个IoC容器对应…

数据结构预科

在堆区申请两个长度为32的空间&#xff0c;实现两个字符串的比较【非库函数实现】 要求&#xff1a; 1> 定义函数&#xff0c;在对区申请空间&#xff0c;两个申请&#xff0c;主函数需要调用2次 2> 定义函数&#xff0c;实现字符串的输入&#xff0c;void input(char …

深度学习 --- stanford cs231学习笔记八(训练神经网络之dropout)

6&#xff0c;dropout 6&#xff0c;1 线性分类器中的正则化 在线性分类器中&#xff0c;我们提到过正则化&#xff0c;其目的就是为了防止过度拟合。例如&#xff0c;当我们要用一条curve去拟合一些散点的数据时&#xff0c;常常是不希望训练出来的curve过所有的点&#xff0c…

【C#】ProgressBar进度条异步编程思想

1.控件介绍 进度条通常用于显示代码的执行进程进度&#xff0c;在一些复杂功能交互体验时告知用户进程还在继续。 在属性栏中&#xff0c;有三个值常用&#xff1a; Value表示当前值&#xff0c;Minimum表示进度条范围下限&#xff0c;Maximum表示进度条范围上限。 2.简单实…

探索人工智能在电子商务平台与游戏发行商竞争中几种应用方式

过去 12 年来&#xff0c;电脑和视频游戏的发行策略发生了巨大变化。数字游戏的销量首次超过实体游戏的销量 在20132020 年的封锁进一步加速了这一趋势。例如&#xff0c;在意大利&#xff0c;封锁的第一周导致数字游戏下载量 暴涨174.9%. 展望未来&#xff0c;市场有望继续增…

配置基于不同IP地址的虚拟主机

定义配置文件vhost.conf <directory /www> allowoverride none require all granted </directory> <virtualhost 192.168.209.136:80> documentroot /www servername 192.168.209.136 </virtualhost><virtualhost 192.168.209.138:80> document…

电阻负载柜或无功负载组?

选择正确电源测试解决方案的快速指南 如果您在市场上寻找负载组&#xff0c;您无疑会遇到电阻式和反应式这两个术语。为了使负载组规范尽可能简单&#xff0c;您需要了解不同类型的负载测试解决方案之间的区别&#xff0c;以及哪种解决方案最适合您的应用。 什么是电阻负载组&…

AntDesign上传组件upload二次封装+全局上传hook使用

文章目录 前言a-upload组件二次封装1. 功能分析2. 代码详细注释3. 使用到的全局上传hook代码4. 使用方式5. 效果展示 总结 前言 在项目中&#xff0c;ant-design是我们常用的UI库之一&#xff0c;今天就来二次封装常用的组件a-upload批量上传组件,让它用起来更方便。 a-uploa…

Gartner发布软件供应链安全指南:软件供应链攻击造成的损失将从 2023 年的460亿美元上升到2031年的1380亿美元

软件供应链安全是一个关键的风险和合规性问题&#xff0c;但大多数组织都以分散的方式处理它。缺乏一个包罗万象的框架会遗留安全漏洞。通过实施三支柱框架&#xff0c;安全和风险管理领导者可以确保广泛的保护。 主要发现 对软件供应链的攻击给组织带来重大的安全、监管和运营…

Twitter群发消息API接口的功能?如何配置?

Twitter群发消息API接口怎么申请&#xff1f;如何使用API接口&#xff1f; 为了方便企业和开发者有效地与用户互动&#xff0c;Twitter提供了各种API接口&#xff0c;其中Twitter群发消息API接口尤为重要。AokSend将详细介绍Twitter群发消息API接口的功能及其应用场景。 Twit…

船舶雷达与导航中M7/8防水插座应用优势

船舶雷达与导航系统是船舶安全航行的重要组成部分&#xff0c;而7/8防水插座在这些系统中起着至关重要的作用。其中防水MIN-change 7/8"航空法兰插座成型预铸电缆式、组装式、面板式法兰座、T-型三通可选 7/8防水插座的电气性能 7/8防水插座因其优良的电气性能而被广泛应…