Protobuf getAllFields() 没有按预期工作

Protobuf getAllFields() not working as expected

我需要解析第三方发送的 protobuf 消息并进行处理。我在访问字段时遇到问题的部分如下所示:

ext {\n  is_foo: NO\n  is_bar: false\n  
12: \"fgyhcbho-4594-34545-gbvj\"\n  13: 0\n } 

我主要对访问字段名“12”的值感兴趣。但是, getAllFields().entrySet() returns 只有 2 个条目 - is_foo 和 is_bar。所以我无法获得字段“12”的值"fgyhcbho-4594-34545-gbvj"。

以下是我使用 protobuf(v2.6) 编译器编译生成的 .proto 文件的一部分。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;
            }
        }
    }

我错过了什么吗?还有其他方法可以访问它吗? 任何帮助表示赞赏。谢谢。

当您看到带有数字标签的字段时,这意味着该字段是未知字段 -- 在线看到的数字与 .proto 文件中定义的任何字段名称都不匹配。

getAllFields() 仅 returns known 字段,因为它 returns 一个描述符->值映射,并且描述符仅存在于已知字段.

要读取未知字段,您需要调用 message.getUnknownFields(),其中 returns 和 UnknownFieldSet。该对象将未知字段编号映射到值。