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

2021-10-12 21:50:57 浏览数 (4)

第一篇:【缘起】

我写了这么一段代码:

代码语言: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_机制理解不到位吗?

1 人点赞