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 http://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to