使用反射在 protobuf 中设置重复字段
Posted
技术标签:
【中文标题】使用反射在 protobuf 中设置重复字段【英文标题】:setting repeated field in protobuf using reflection 【发布时间】:2017-02-01 18:43:37 【问题描述】:我有一个类似这样的 protobuf 消息:
message foo
repeated double values = 1;
我正在使用反射(如 here 解释)在我的 C++ 代码中设置这样的值
auto desc = protoMsg.GetDescription();
auto refl = protoMsg.GetReflection();
auto fd = desc->FindFieldByNumber(1); // run time value
assert(fd->is_repeated());
for (int i = 0; i < vect.size(); ++i)
refl->SetRepeatedDouble(&protoMsg, fd, i, vect[i]);
我的应用程序在 SetRepeatedDouble
函数内崩溃。有没有人尝试过这样的事情? (使用反射设置值?请注意,由于我的应用程序的动态特性,我必须使用反射。我已经稍微简化了上面的代码,暂时不要这样做)
还感谢任何有关如何调试此问题的提示。
【问题讨论】:
【参考方案1】:SetRepeatedDouble()
覆盖数组中已经存在的元素。为了使您的代码正常工作,重复字段的大小必须至少等于vect.size()
,否则您将超出数组,这确实会导致崩溃(或更糟)。如果您从一个空消息实例开始,那么您需要添加值而不是设置它们,如下所示:
for (int i = 0; i < vect.size(); ++i)
refl->AddDouble(&protoMsg, fd, vect[i]);
【讨论】:
谢谢!不过,这有点不直观。文档说如下: - 可能的错误来源: - 在重复字段上调用单个字段的 Get*() 或 Set*() 方法。 - 在非重复字段上调用 GetRepeated*()、SetRepeated*() 或 Add*()。以上是关于使用反射在 protobuf 中设置重复字段的主要内容,如果未能解决你的问题,请参考以下文章