将通过`DynamicMessageFactory`解析的消息转换为具体的子类型

时间:2013-01-09 08:02:53

标签: c++ protocol-buffers

我正在创建一个包含protobuf消息解析的库。由于库无法知道将使用哪些消息,因此它使用google::protobuf::DynamicMessageFactory解析消息。

但是,我希望能够将解析后的消息传递回程序中了解实际消息类型的其他部分。

换句话说同样的问题: 我通过const google::protobuf Message*google::protobuf::compiler::Importer创建了google::protobuf::DynamicMessageFactory。在解析之后,我知道该消息实际上是TestMessage(并且程序知道该类),我可以以某种方式将Message*转换为TestMessage吗?

我不能简单地dynamic_cast消息,如果使用我猜的通用NULL解析消息,则转换的结果总是Message::ParseFromXXX因为这些方法只是返回某种代理对象,无法了解实际的消息类。

我也尝试了以下内容:

//message is a const google::protobuf::Message* parsed using DynamicMessageFactory
TestMessage *tr = new TestMessage;
tr->CopyFrom( *message );

但是,当protobuf说“尝试合并不同类型的消息”时,它失败了。请注意,tr->GetTypeName()message->GetTypeName()会返回相同的类型名称。

我很感谢任何帮助

1 个答案:

答案 0 :(得分:0)

TestMessage实际上是否继承自Message? dynamic_cast 返回null的事实表明它没有,这意味着这些类是无关的,尝试从一个转换为另一个没有意义。或者它可能使用私有继承。