2016-12-13 25 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