First of all, you can't parse PB data without knowing the schema. The schema originally comes from a ".proto" file and is typically embedded in the code generated by protoc
. However, you can also tell protoc
to store the schema in a format that's usable by the Java Protobuf library:
protoc --descriptor_set_out=mymessages.desc mymessages.proto
Then load it in your Java code:
FileInputStream fin = new FileInputStream("mymessages.desc");
Descriptors.FileDescriptorSet set =
Descriptors.FileDescriptorSet.parseFrom(fin);
Descriptors.Descriptor md = set.getFile(0).getMessageType(0);
Once you have the schema for a message (Descriptor.Descriptor
) parsing a message is easy:
byte[] data = ...;
DynamicMessage m = DynamicMessage.parseFrom(md, data);
DynamicMessage
has a reflective API that lets you look through the fields.
The messy part is calling out to the protoc
tool to convert the ".proto" file into a usable format. The C++ Protobuf library has a way to load ".proto" files directly, but unfortunately the Java Protobuf library does not.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…