Protobuf getAllFields()没有按预期工作

时间:2016-12-13 21:44:20

标签: java protocol-buffers

我需要解析第三方发送的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;
            }
        }
    }

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

1 个答案:

答案 0 :(得分:1)

当您看到带有数字标签的字段时,表示该字段是未知字段 - 电线上显示的数字与.proto文件中定义的任何字段名称都不匹配。

getAllFields()仅返回已知字段,因为它返回描述符 - &gt;值映射,而描述符仅存在于已知字段。

要阅读未知字段,您需要致电message.getUnknownFields(),并返回UnknownFieldSet。该对象将未知字段数映射到值。