使用反射在 protobuf 中设置重复字段
setting repeated field in protobuf using reflection
我有一个类似这样的 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
函数内崩溃。以前有没有人试过做这样的事情? (使用反射设置值?请注意,由于我的应用程序的动态特性,我必须使用反射。我稍微简化了上面的代码,暂时不这样做)
也欢迎任何关于如何调试的提示。
SetRepeatedDouble()
覆盖数组的 already-present 元素。为了让您的代码正常工作,重复字段的大小必须至少等于 vect.size()
,否则您将超出数组,这确实会导致崩溃(或更糟)。如果您从空消息实例开始,那么您需要 添加 值而不是设置它们,如下所示:
for (int i = 0; i < vect.size(); ++i)
refl->AddDouble(&protoMsg, fd, vect[i]);
我有一个类似这样的 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
函数内崩溃。以前有没有人试过做这样的事情? (使用反射设置值?请注意,由于我的应用程序的动态特性,我必须使用反射。我稍微简化了上面的代码,暂时不这样做)
也欢迎任何关于如何调试的提示。
SetRepeatedDouble()
覆盖数组的 already-present 元素。为了让您的代码正常工作,重复字段的大小必须至少等于 vect.size()
,否则您将超出数组,这确实会导致崩溃(或更糟)。如果您从空消息实例开始,那么您需要 添加 值而不是设置它们,如下所示:
for (int i = 0; i < vect.size(); ++i)
refl->AddDouble(&protoMsg, fd, vect[i]);