2016-12-13 1 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. Поэтому я не могу получить значение «fgyhcbho-4594-34545-gbvj» поля «12».

Ниже приводится часть моего файла .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 = this.protoReq.getExt(). GetUnknownFields(). GetField (12); ', возвращает пустую коллекцию. Я использую protobuf 2.6, просто FYI. – pooja

+0

@pooja AFAIK, который должен работать. :/Возможно, если вы предоставили больше кода, я мог бы обнаружить проблему. –

+0

Я отредактировал вопрос, чтобы включить .proto part. Пожалуйста, дайте мне знать, если это поможет. Я застрял. Оцените любой указатель. Благодарю. – pooja