我需要解析第三方发送的protobuf消息并处理这些消息。我在访问字段时遇到问题的部分如下所示:
ext {\n is_foo: NO\n is_bar: false\n
12: \"fgyhcbho-4594-34545-gbvj\"\n 13: 0\n }
我主要感兴趣的是访问字段名“12”的值。但是,getAllFields()。entrySet()只返回2个条目 - is_foo和is_bar。因此我无法获得字段“12”的值“fgyhcbho-4594-34545-gbvj”。
以下是我的.proto文件的一部分,我使用protobuf(v2.6)编译器编译生成.java文件:
message Ext {
optional bool is_foor = 1;
optional bool is_bar = 2;
optional string uid = 12;
optional int32 did = 13;
}
我的.java文件包含方法hasUid()和getUid()。但我收到的protobuf消息包含字段“12”而不是“uid”。因此,当我尝试反序列化为Java时,它只是不包含该字段而且也不包含未知字段。
以下是我正在使用的代码段:
if (this.protoReq.getExt() != null) {
for (Map.Entry<FieldDescriptor, Object> entry : this.protoReq.getExt().getAllFields().entrySet()) {
FieldDescriptor field = entry.getKey();
if (field.getName().equals("12")) {
Object value = entry.getValue();
if (value != null) {
//do something
}
break;
}
}
}
我错过了什么吗?有没有其他方法可以访问它? 任何帮助表示赞赏。谢谢。
答案 0 :(得分:1)
当您看到带有数字标签的字段时,表示该字段是未知字段 - 电线上显示的数字与.proto
文件中定义的任何字段名称都不匹配。
getAllFields()
仅返回已知字段,因为它返回描述符 - &gt;值映射,而描述符仅存在于已知字段。
要阅读未知字段,您需要致电message.getUnknownFields()
,并返回UnknownFieldSet
。该对象将未知字段数映射到值。