为什么protobuf只读取最后一条消息作为输入结果?

时间:2017-01-13 01:43:29

标签: c++ parsing numbers protocol-buffers message

通常,我们使用protobuf多次传达一条消息,每条消息都有不同的消息内容。但我发现似乎读者端处理整个消息,并且只使用最后一个消息,如下所示:

$cat 30.proto
message hello
{
    required int32 f1=1;
    required int32 f2=2;
    optional int32 f3=3;
}

$cat 30.cpp
#include "30.pb.h"
#include<fstream>
#include<iostream>
using namespace std;
int main()
{
    fstream fo("./log30.data",ios::binary|ios::out);
    hello p1,p2,p3;
    p1.set_f1(1);
    p1.set_f2(2);
    p2.set_f1(3);
    p2.set_f2(4);
    p3.set_f1(5);
    p3.set_f2(6);
    p1.SerializeToOstream(&fo);
    p2.SerializeToOstream(&fo);
    p3.SerializeToOstream(&fo);
    fo.close();

    fstream fi("./log30.data",ios::binary|ios::in);
    hello pi;
    pi.ParseFromIstream(&fi);
    cout<<pi.f1()<<pi.f2()<<endl;
    return 0;
}

编译并运行,程序输出: 56

好吧,我预计当我第一次从log30.data解析时,“pi”应该读取第一个对象,因此打印“12”。对我来说,看起来Parse会在信息的最后给出最后的信息。

我的问题是,我们使用pb作为rpc编码/解码通道在对等体之间传递许多消息,如果只解析一条消息,那么它在生产级别中的真正用途是什么?也许我的解释是不正确的,请妥善解释。

非常感谢

1 个答案:

答案 0 :(得分:1)

您只能将一条消息写入输出流。 API 提供记录分隔容器格式!

因此,当您读取数据时,所有内容都被假定为同一消息的一部分,并且遵循仅保留单项字段的最后一个值的常规协议。