从C ++中的协议缓冲区读取重复字段的问题

时间:2013-11-26 20:30:44

标签: c++ protocol-buffers

org.proto

message Optimize {
    required int element_size = 1;
    required string element_name = 2;
}

message nodes {
    repeated Optimize = 1;
}

具有此解码功能:

DecodeNodeMsg(char *msg, int size)
{

    Org::nodes node;
    int element_size;
    string element_name;
    int NumofElem = 0;

    node.ParseFromArray((void *)msg, size);

    for (int i = 0; i < nodes.Optimize().size(); i++)
    {
        element_size = nodes.Optimize(i).element_size();
        element_name = nodes.Optimize(i).element_name();
        cout << "size" << element_size << endl;
        cout << "name" << element_name << endl;
        NumofElem++;
    }
    cout << "number of" << NumofElem << endl;
}

我正在编码节点消息,其中包含三条Optimize消息。并调用此解码功能。编码部分是一个很久以来工作正常的旧代码。所以我不怀疑编码功能。

在解码功能中,我看到NumofElem被正确打印为三个。但是,我看到element_size&amp; element_name只是垃圾。整数有一些垃圾值,字符串有二进制数据。

我只有在这个重复的字段时才遇到这个问题。如果字段是必填/可选字段,那么我没有这个问题。

有人可能有类似的问题......?如果有任何关于如何解决这个问题的线索?

谢谢, 基兰

2 个答案:

答案 0 :(得分:1)

我看不到你实际解码消息的位置。我看到你创建了一个新的节点对象,但随后调用了看起来错误的Org :: nodes()。我认为你需要像这样访问Optimize元素:

for (int i = 0; i < node->optimize_size(); i++)
{
    element_size = node->optimize(i).element_size();
    element_name = node->optimize(i).element_name();
    cout << "size" << element_size << endl;
    cout << "name" << element_name << endl;
    NumofElem++;
}

但我认为你的节点对象需要从某些东西中解码。可变方法允许您设置数据。还有ParseFrom方法。同样在我的proto文件中,我对消息中的元素进行编号。见https://developers.google.com/protocol-buffers/docs/overview

 message nodes {
   repeated Optimize = 1;
 }

答案 1 :(得分:1)

该函数将缓冲区反序列化为局部变量节点,但循环引用节点。我还要验证ParseFromArray的返回值。