Thanks for your reply. My application links against all the stub proto sources of the types I will be creating. What I've found works is if I use the default(?) descriptor pool (google::protobuf::DescriptorPool::generated_pool()) and the default message factory (google::protobuf::MessageFactory::generated_factory()). Given the type name and the content, I have a simple function that more or less does this:
const gpb::Descriptor* descriptor = gpb::DescriptorPool::generated_pool()->FindMessageTypeByName( "my.package.Foo" ); gpb::MessageFactory* factory = gpb::MessageFactory::generated_factory(); const gpb::Message* prototype = factory->GetPrototype( descriptor ); gpb::Message* message = prototype->New(); gpb::Message* m = gpb::TextFormat::ParseFromString( "blah: \"some string\" bleh: 3", message ); On Wednesday, January 16, 2013 4:15:53 PM UTC-8, m wrote: > > Hi All, > > I'm seeing an incompatibility between a dynamically generated > google::protobuf::Message (DynamicMessage?) created with a > google::protobuf::DynamicMessageFactory and a normal > google::protobuf::Message. > > What I'm running up against ultimately comes down to this: I can't > dynamic_cast a DynamicMessage to a known derived type of > google::protobuf::Message. For example, let's say my proto file has the > following message: > > package my.package; > > messsage Foo > { > string blah = 1; > uint32 bleh = 2; > } > > > and I successfully create a my::package::Foo with some code along the > lines of: > > const google::protobuf::Descriptor* descriptor = > myImporter.pool()->FindMessageTypeByName( > "my.package.Foo" ); > > google::protobuf::Message* message = myDynamicMessageFactory.GetPrototype( > descriptor )->New(); > > > after populating message successfully with other commands not shown here, > I try to do something like: > > my::package::Foo foo; > foo.CopyFrom( *message ); > > > and I get a segfault in CopyFrom() because ultimately the following > doesn't work (the pointer pFoo ends up being NULL down inside > CopyFrom()/MergeFrom()): > > my::package::Foo* pFoo = dynamic_cast< my::package::Foo* >( message ); > > > It appears as though the derived type of message is not actually > my::package::Foo, but instead google::protobuf::DynamicMessage (or > something like that), so naturally the dynamic_cast fails. I was sure to > observe the output of message->DebugString() and message->GetTypeName() > which returned all the appropriate information. > > Is there any way to get a real my::package::Foo object from a dynamic one? > > > -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To view this discussion on the web visit https://groups.google.com/d/msg/protobuf/-/-Q3WjR4djmsJ. To post to this group, send email to protobuf@googlegroups.com. To unsubscribe from this group, send email to protobuf+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/protobuf?hl=en.