gRPC踩过的坑–嵌套message与enum的使用(C++版本) |
您所在的位置:网站首页 › serialNo=060900020042b9633c9e › gRPC踩过的坑–嵌套message与enum的使用(C++版本) |
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 |