At least in Java, you can do everything fully dynamically at runtime. The native API can get quite confusing (between all the protos/descriptors/files...). I distilled following wrapper to make it easier: https://github.com/os72/protobuf-dynamic
On Friday, April 1, 2016 at 4:32:29 PM UTC-7, Josh Haberman wrote: > > Hi Mike, > > Python indeed has descriptor classes that you can use to build proto > definitions at runtime. However it does not have a parser for .proto files > built in. So if you want to load .proto files at runtime, you'll need to > use protoc to build a descriptor (for example, you could shell out to > protoc). > > Josh > > On Monday, March 21, 2016 at 10:43:24 AM UTC-7, Mike Trienis wrote: >> >> Hi, >> >> Do you know if it's possible do dynamic decoding at run-time using the >> Python API? >> >> - >> https://developers.google.com/protocol-buffers/docs/reference/python/ >> >> Indeed there is a descriptor.FileDescriptor, however I'm not sure what >> the other classes correspond to? >> >> Thanks, Mike. >> >> On Tuesday, August 12, 2014 at 10:36:13 AM UTC-7, Feng Xiao wrote: >>> >>> Protobuf supports creating message types dynamically at runtime and use >>> them for parsing/serialization/etc. >>> >>> First you need to build up a DescriptorPool >>> <https://code.google.com/p/protobuf/source/browse/trunk/src/google/protobuf/descriptor.h#1141> >>> >>> that contains all types that you may want to use. There are two approaches >>> to construct this pool. One is to call DescriptorPool::BuildFile() directly >>> with parsed proto files. For example: >>> // Convert .proto files into parsed FileDescriptorProto >>> bool ParseProtoFile(string filename, FileDescriptorProto* result) { >>> FileInputStream stream(filename); >>> google::protobuf::io::Tokenizer tokenizer(&stream); >>> google::protobuf::compiler::Parser parser; >>> return parser.Parse(&tokenizer, result); >>> } >>> // Build the descriptor pool >>> DescriptorPool pool; >>> for (string filename : proto_files) { >>> FileDescriptorProto proto; >>> ParseProtoFile(filename, &proto); >>> pool.BuildFile(proto); >>> } >>> >>> After you have the pool, you can query for a type by its name. For >>> example, DescriptorPool::FindMessageTypeByName(). >>> >>> Then to actually parse/serialize/use message types in the pool, you need >>> to construct message objects around them. DynamicMessage >>> <https://code.google.com/p/protobuf/source/browse/trunk/src/google/protobuf/dynamic_message.h#53> >>> >>> is used for that: >>> // Suppose you want to parse a message type with a specific type name. >>> Descriptor* descriptor = >>> pool.FindMessageTypeByName(message_type_to_parse); >>> DynamicMessageFactory factory; >>> unique_ptr<Message> message = factory.GetPrototype(descriptor)->New(); >>> // Use the message object for parsing/etc. >>> message->ParseFromString(input_data); >>> // Access a specific field in the message >>> FieldDescriptor* field = descriptor->FindFieldByName(field_to_read); >>> switch (field->type()) { >>> case TYPE_INT32: message->GetReflection()->GetInt32(*message, >>> field); break; >>> ... >>> } >>> >>> On Mon, Aug 11, 2014 at 9:31 PM, Jan Kyjovský <[email protected]> >>> wrote: >>> >>>> Hi, >>>> >>>> I have very specific problem. I have data and proto file available and >>>> my application should take both and based on external configuration >>>> determine how to interpret data (many different types/messages in proto). >>>> Yet that can be determine only during run. My question is if there is any >>>> support for that, I mean that I will be able to parse proto and decode >>>> data >>>> based on content of interpret intermediate structures. >>>> >>>> I have been trying to analyze this possibility directly from codes but >>>> not with much success. I would be glad for any guidance. >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Protocol Buffers" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> To post to this group, send email to [email protected]. >>>> Visit this group at http://groups.google.com/group/protobuf. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/protobuf. For more options, visit https://groups.google.com/d/optout.
