使用反射在 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 中设置重复字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在构建消息之前在 protobuf 中设置重复字段?

在没有 getter 或反射的情况下访问依赖字段 [重复]

如何将向量添加到重复字段protobuf c ++

在日期字段中设置日期将其设置为前一天[重复]

如何在 Sql Server 2008 中设置唯一约束 [重复]

为啥反射不在 Struct 中设置属性?