考虑以下原始文件。
syntax="proto3";
message MessageWithInternalMessage {
string F1 = 1;
_S1 s2 = 5;
message _S1 {
string C1 = 1;
string C2 = 2;
}
}
当我们为其生成代码时。解析使用readTag(),然后进行开关语句来设置相应的字段。或考虑以下片段。
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;
}
}
}
我的问题是proto文件中的"字段f1的标签1"至"生成代码中的情况10"one_answers"在生成代码中的情况42"字段S2的"标签5"。
标题的编码格式基本上是:
header = (fieldNumber << 3) | expectedWireType;
"电线类型"是0和7之间的整数。
- 0 = VARINT -BASE -128编码整数,持续位
- 1 = 64位(整数或浮点)
- 2 =长度预定的数据 - 字节数的范围,然后是许多字节(字符串,斑点,子丝,填充阵列)
- 5 = 32位(整数或浮点)
so字段1作为字符串为(1&lt;&lt; 3)|2是二进制1010,或:10。字段5作为一个子消息也是同样的(5&lt;&lt; 3)|2,或:42