使用反射在 protobuf 中设置重复字段

setting repeated field in protobuf using reflection

本文关键字:设置 字段 protobuf 反射      更新时间:2023-10-16

我有一个类似的protobuf消息:

message foo {
   repeated double values = 1;
}

我正在使用反射(如此处所述)在我的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崩溃。以前有人尝试过做这样的事情吗?(使用反射设置值?请注意,由于应用程序的动态性质,我必须使用反射。我已经稍微简化了上面的代码,暂时不这样做)

此外,非常感谢有关如何调试此问题的任何提示。

SetRepeatedDouble()覆盖数组中已经存在的元素。为了使您的代码正常工作,重复字段的大小必须至少等于 vect.size() ,否则您将溢出数组,这确实会导致崩溃(或更糟)。如果从空消息实例开始,则需要添加值而不是设置它们,如下所示:

for (int i = 0; i < vect.size(); ++i)
    refl->AddDouble(&protoMsg, fd, vect[i]);