gRPC踩过的坑–嵌套message与enum的使用(C++版本)

您所在的位置:网站首页 serialNo=060900020042b9633c9e gRPC踩过的坑–嵌套message与enum的使用(C++版本)

gRPC踩过的坑–嵌套message与enum的使用(C++版本)

2024-07-10 07:30| 来源: 网络整理| 查看: 265

1.嵌套message 1.1 什么是message

protobuf是google团队开发的用于高效存储和读取结构化数据的工具。protobuf将一种结构称为一个message类型。里面存放各种数据类型,其实按我的理解message无非就跟C语言的结构体一样,里面的数据类型就是对应结构体成员。

例如定义一个硬件信息消息结构,里面包含产品序列号和硬件版本号。 在消息定义中,每个字段都有唯一的一个数字标识符。这些标识符是用来在消息的二进制格式中识别各个字段的,一旦开始使用就不能够再改变。 我的理解是通过标识符序列化成二进制数据之后,能够准确的反序列化回原来的样子。

12345message HardwareInfo {     string SerialNo = 1;     string HardwareVersion = 2; } 1.2 什么是嵌套message

顾名思义就是message结构内部再嵌套一层message结构,跟结构体嵌套大同小异。

12345678typedef struct {     string SerialNo;     string HardwareVersion; } HardwareInfo; typedef struct {     HardwareInfo HardwareInfoValue; } ModemInfoMessage;

嵌套message

12345678910message HardwareInfo {     string SerialNo = 1;     string HardwareVersion = 2; } message ModemInfoMessage {     HardwareInfo HardwareInfoValue = 1; } 1.3 如何使用嵌套message

例如我想要实现一个rpc接口 rpc GetInfo(Request) returns (ModemInfoMessage);

那么服务端如何设置reply? 具体设置如下:

1reply_.mutable_hardwareinfovalue()->set_hardwareversion(hard_version_buf);

注意事项: 之前踩过坑,一直以为以proto定义的变量为准,于是我设置relay为

1reply_.mutable_HardwareInfoValue()->set_HardwareVersion(hard_version_buf);

编译报错

123456greeter_server.cc: In member function ‘void ServerImpl::CallData::Proceed()’: greeter_server.cc:163:20: error: ‘class cater::ModemInfoMessage’ has no member named ‘mutable_HardwareInfovalue’              reply_.mutable_HardwareInfovalue()->set_HardwareVersion(hard_version_buf);                     ^ make: *** [greeter_server.o] Error 1 make: *** Waiting for unfinished jobs....

当时是一脸懵逼,后面查阅源码发现原来protoc会将相应的数据编译生成对应的接口。

查看了下cater.pb.h有详细声明(这个文件是proto文件使用protoc编译生成的.h文件)

1234567891011121314// .cater.HardwareInfo HardwareInfoValue = 1;   bool has_hardwareinfovalue() const;   private:   bool _internal_has_hardwareinfovalue() const;   public:   void clear_hardwareinfovalue();   const ::cater::HardwareInfo& hardwareinfovalue() const;   ::cater::HardwareInfo* release_hardwareinfovalue();   ::cater::HardwareInfo* mutable_hardwareinfovalue();   void set_allocated_hardwareinfovalue(::cater::HardwareInfo* hardwareinfovalue);   private:   const ::cater::HardwareInfo& _internal_hardwareinfovalue() const;   ::cater::HardwareInfo* _internal_mutable_hardwareinfovalue();   public:

当使用嵌套的message时只需要调用对应的mutable_你自己声明的数据,指向子message中的数据类型即可。

2.enum用法

这个enum类型与C用法相同。

123456enum MODEM_MESSAGE {    INVALID_MESSAGE = 0;    HARDWARE_INFO = 1;    SOFTWARE_INFO = 2; }

使用的过程中注意小写

比如请求为枚举类型,注意两点,一是set对应的方式全部为小写,二是要注意命名空间的使用。

1234message Request {     MODEM_MESSAGE RequestType; } 12Request request_; request_.set_requesttype(cater::HARDWARE_INFO);

cater.pb.h同样也有声明

12345678910namespace cater { enum MODEM_MESSAGE : int {   INVALID_MESSAGE = 0,   HARDWARE_INFO = 1,   SOFTWARE_INFO = 2,   MODEM_MESSAGE_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits::min(),   MODEM_MESSAGE_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits::max() }; .......... 12345678// .cater.MODEM_MESSAGE RequestType = 1;   void clear_requesttype();   ::cater::MODEM_MESSAGE requesttype() const;   void set_requesttype(::cater::MODEM_MESSAGE value);   private:   ::cater::MODEM_MESSAGE _internal_requesttype() const;   void _internal_set_requesttype(::cater::MODEM_MESSAGE value);   public:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3