Java “之间的关系是什么?”;字段的.proto文件中的标记号;及;生成代码中的编号(用于通过开关大小写进行解析)“;?
考虑下面的proto文件Java “之间的关系是什么?”;字段的.proto文件中的标记号;及;生成代码中的编号(用于通过开关大小写进行解析)“;?,java,protocol-buffers,protobuf-java,Java,Protocol Buffers,Protobuf Java,考虑下面的proto文件 syntax="proto3"; message MessageWithInternalMessage { string F1 = 1; _S1 s2 = 5; message _S1 { string C1 = 1; string C2 = 2; } } 当我们为它生成代码时。解析使用readTag()完成,然后使用switch语句设置相应的字段。或者考虑下面的片段。 while (!done) {
syntax="proto3";
message MessageWithInternalMessage {
string F1 = 1;
_S1 s2 = 5;
message _S1 {
string C1 = 1;
string C2 = 2;
}
}
当我们为它生成代码时。解析使用readTag()完成,然后使用switch语句设置相应的字段。或者考虑下面的片段。
while (!done) {
int tag = input.readTag();
switch (tag) {
case 0:
done = true;
break;
default: {
if (!parseUnknownFieldProto3(input, unknownFields, extensionRegistry, tag)) {
done = true;
}
break;
}
case 10: {
java.lang.String s = input.readStringRequireUtf8();
f1_ = s;
break;
}
case 42: {
Test.InternalMessageWithSeciton._S1.Builder subBuilder = null;
if (s2_ != null) {
subBuilder = s2_.toBuilder();
}
s2_ = input.readMessage(Test.InternalMessageWithSeciton._S1.parser(), extensionRegistry);
if (subBuilder != null) {
subBuilder.mergeFrom(s2_);
s2_ = subBuilder.buildPartial();
}
break;
}
}
}
我的问题是,两者之间的关系是什么
将原型文件中的“F1字段标记1”改为“生成代码中的案例10”,以及
“字段s2的标记5”到“生成代码中的情况42”。标题的编码格式基本上是:
header = (fieldNumber << 3) | expectedWireType;
header=(字段号,如您所说的“expectedWireType”可以取0到7之间的值。在什么情况下我应该使用3,4,6,7?@Ran 3和4是开始/结束组标记-组基本上不推荐使用,您通常不需要它们。6和7保留供将来使用。当我们为重复的可打包数据类型生成代码时,代码在生成的代码中生成为两个标记。例如,如果我的代码生成f或重复int32f=1;生成的代码将类似于案例8:{}案例10:{}这是为了使写入的数据与打包的true和打包的false兼容。我想知道从标记1生成8和10的逻辑。8是1000//1是标记,000是线格式编号,10是1010//1是标记,010是线格式编号。我的问题是为什么相同的int32有两个线格式NUM?原因是什么logic@Ran田头它们是:header=(fieldNumber@Ran,特别是对于大型数组;当只有3个值时,显然不太清楚,但当有300个值时:这将是“{header size}{length size}{size of 300 values}”(其中长度大小通常只有几个字节)与300x“{header size}{value size}”