【发布时间】:2017-01-12 21:26:31
【问题描述】:
例如,如果我这样定义一张照片:
$cat 30.proto
message hello
{
required int32 f1=1;
required int32 f2=2;
optional int32 f3=3;
}
如果 protobuf 可以处理这样的事情,我会加倍:
我声明了 3 个对象,每个对象都没有
f3字段。写入输出
那么,在阅读器方面,阅读器如何知道这6个值应该属于3个对象(每个2个字段),还是属于2个对象(每个3个字段)?
换句话说,“需要”/“可选”如何反映在编码字节中?如果不反映在字节流中,那么protobuf如何确定新偏移的开始?我们知道 protobuf 没有“分隔符”位。
我对此做了一个简单的快速测试:
$cat 30.cpp
#include "30.pb.h"
#include<fstream>
using namespace std;
int main()
{
fstream f("./log30.data",ios::binary|ios::out);
hello p1,p2,p3,p4,p5;
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(&f);
p2.SerializeToOstream(&f);
p3.SerializeToOstream(&f);
p4.set_f1(7);
p4.set_f2(8);
p4.set_f3(9);
p5.set_f1(0xa);
p5.set_f2(0xb);
p5.set_f3(0xc);
p4.SerializeToOstream(&f);
p5.SerializeToOstream(&f);
return 0;
}
$g++ 30.cpp 30.pb.cc -lprotobuf && ./a.out && xxd log30.data
00000000: 0801 1002 0803 1004 0805 1006 0807 1008 ................
00000010: 1809 080a 100b 180c ........
我只是猜测字节流是否总是以最小的标记号开始,并随着它转储字节流而增加:当遇到较小的标记号时,它认为这是一个新对象的开始。只是我的拙见。
需要你的解释!
【问题讨论】:
标签: linux object protocol-buffers encode delimiter