前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >日更系列:错误设置protobuf对象的防不胜防

日更系列:错误设置protobuf对象的防不胜防

原创
作者头像
mariolu
修改2021-10-12 21:50:57
4080
修改2021-10-12 21:50:57
举报
文章被收录于专栏:CDN及云技术分享

第一篇:【缘起】

我写了这么一段代码:

代码语言:javascript
复制
RecommendResponse recommendResponse;

*(recommendResponse.recominfo().mutable_vecitem()) = {items.begin(), items.end()};

为了做一件事情,设置推荐响应的物品item的打分结果。(item在这个场景是广告app)。

本以为这样就安然无事,但是算法同学反馈我这边给了个空包,里面无一个item。从hdfs捞日志看响应包确实为空。

可能我对pb的读写有点误解。

首先我想到的是创造一个空响应,定义为RecommendResponse。

然后呢这个RecommendResponse在栈上应该会创建一个内嵌的结构体recominfo。

proto文件定义如下(为了方便阅读,裁掉不相干的内容):

代码语言:javascript
复制
message RecommendInfo{
 repeated RecommendItem vecItem = 1;  
}

message RecomResponse{
 RecommendInfo recomInfo = 1;
}

于是我在recomInfo这个结构体实例上继续添加vecitem

那么根据mutalbe_vecitem规则,我应该这样添加。用大括号重载{},传入items(类型为std::vector)的begin()和end()迭代器。

代码语言:javascript
复制
 *(recom_response.recominfo().mutable_vecitem()) = {items.begin(), items.end()};

这样应该可以设置recommendResponse.recominfo(),那么这样recommendResponse也相应生成。

但是发现得用

代码语言:javascript
复制
*(recom_response.mutable_recominfo()->mutable_vecitem()) = {items.begin(), items.end()};这样应该可以设置recommendResponse.recominfo(),那么这样recommendResponse也相应生成。

这样才能生成recommendResponse这个结构体实例。

第二篇:【缘灭】

那么到底这个错误关键点上哪里呢,对mutable_机制理解不到位吗?

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一篇:【缘起】
  • 第二篇:【缘灭】
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档