Например, если я определяю фото вроде этого:Как protobuf судит, принадлежит ли значение к необязательному полю или другому объекту?
$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 определяет начало нового смещения? Мы знаем, что протобуф не имеет бит «разделителя».
У меня был простой быстрый тест на это:
$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 ........
Я только догадывался, если поток байт всегда начинается с наименьшим числом тегов, и возрастает, как он сбрасывает поток байтов: когда число меньше тега он считает, что это начало нового объекта. Просто моя скромная догадка.
Нужно ваше объяснение!