2016-12-13 20 views
0

我需要解析第三方发送的protobuf消息并处理它们。在那里,我在访问领域面临的问题的一部分看起来像以下:Protobuf getAllFields()不能按预期工作

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

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

getAllFields()仅返回已知字段,因为它返回一个描述符 - >值映射,并且描述符只存在于已知字段中。

要读取未知字段,您需要致电message.getUnknownFields(),它返回UnknownFieldSet。该对象将未知的字段编号映射到值。

+0

谢谢@Kenton。这很好。但即使我使用getUnknownFields(),即下面的代码: - 'Field field = this.protoReq.getExt()。getUnknownFields()。getField(12); ',返回空集合。我使用protobuf 2.6,仅供参考。 – pooja

+0

@pooja AFAIK应该工作。 :/也许如果你提供了更多的代码,我可以发现问题。 –

+0

我编辑过的问题包含.proto部分。请让我知道,如果有帮助。我被卡住了。欣赏任何指针。谢谢。 – pooja