为什么我的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个数据.这是为什么呢.
protobuf 的 wire format 是没有消息起始和结束的标志的。它里面只有一堆的 key / value 对。
所以读的时候并不知道里面有两个 message 。它只看到了一堆 key / value 对,其中 key 有重复的(因为有两个 message),后出现的就把先出现的覆盖了。于是读出来就是一条 message ,并且值是后写入的那一条的。
可参考:https://protobuf.dev/programming-guides/encoding/