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.

Reply via email to