为什么我的protobuf在硬盘上的读写会出问题?

为什么我的protobuf在硬盘上的读写会出问题.

syntax="proto3";
message Pic_log
{
     string name =1;
     int32 time =2;
     string  feature_number =3;
}

这是message的定义.

int main()
{
    char feature_number[76]{0};
    Pic_log p1,p2,p3;
    ofstream output("./pic_lo",ios::out|ios::binary|ios::trunc);

    //第一个数据对象定义
    p1.set_name("name");
    p1.set_time(12345);
    p1.set_feature_number(feature_number);
    p1.SerializeToOstream(&output);

    //第2个数据对象定义
    p2.set_name("ne");
    p2.set_time(125);
    p2.set_feature_number(feature_number);
    p2.SerializeToOstream(&output);

    output.close();

    //开始从文件里读回数据
    ifstream input("./pic_lo",ios::in|ios::binary);
    if(!input)
    {
        cout<<"文件打开失败"<<endl;
        return 0;
    }

    while(!input.eof())
    {
        p3.ParseFromIstream(&input);
        cout<<p3.name()<<endl;
    }
    input.close();

    return 0;
}

这是我在硬盘上读写它的代码.
输出是一行ne,它只读到了1个,而且是第2个数据.这是为什么呢.

阅读 524
1 个回答

protobuf 的 wire format 是没有消息起始和结束的标志的。它里面只有一堆的 key / value 对。

所以读的时候并不知道里面有两个 message 。它只看到了一堆 key / value 对,其中 key 有重复的(因为有两个 message),后出现的就把先出现的覆盖了。于是读出来就是一条 message ,并且值是后写入的那一条的。

可参考:https://protobuf.dev/programming-guides/encoding/

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题