Мне нужно проанализировать сообщения 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;
}
}
}
ли я что-то отсутствует? Есть ли другой способ получить к нему доступ? Любая помощь приветствуется. Спасибо.
Спасибо @ Kenton. Это хорошо знать. Но даже если я использую getUnknownFields(), то есть следующий код: - Поле field = this.protoReq.getExt(). GetUnknownFields(). GetField (12); ', возвращает пустую коллекцию. Я использую protobuf 2.6, просто FYI. – pooja
@pooja AFAIK, который должен работать. :/Возможно, если вы предоставили больше кода, я мог бы обнаружить проблему. –
Я отредактировал вопрос, чтобы включить .proto part. Пожалуйста, дайте мне знать, если это поможет. Я застрял. Оцените любой указатель. Благодарю. – pooja