Прежде всего, вы не можете анализировать данные PB, не зная схемы. Схема изначально взята из файла ".proto" и обычно встроена в код, сгенерированный protoc
. Однако вы также можете указать protoc
хранить схему в формате, который может использоваться библиотекой Java Protobuf:
protoc --descriptor_set_out=mymessages.desc mymessages.proto
Затем загрузите его в свой код Java:
FileInputStream fin = new FileInputStream("mymessages.desc");
Descriptors.FileDescriptorSet set =
Descriptors.FileDescriptorSet.parseFrom(fin);
Descriptors.Descriptor md = set.getFile(0).getMessageType(0);
Если у вас есть схема для сообщения (Descriptor.Descriptor
), анализ сообщения выполняется просто:
byte[] data = ...;
DynamicMessage m = DynamicMessage.parseFrom(md, data);
DynamicMessage
имеет отражающий API, который позволяет просматривать поля.
Беспорядочная часть обращается к инструменту protoc
для преобразования файла .proto в пригодный для использования формат. Библиотека C ++ Protobuf позволяет напрямую загружать файлы ".proto", но, к сожалению, библиотека Java Protobuf этого не делает.