0

protobuf メッセージの解析を含むライブラリを作成しています。ライブラリはどのメッセージに使用されるかを認識できないため、google::protobuf::DynamicMessageFactory.

ただし、解析されたメッセージを、実際のメッセージの種類を知っているプログラムの他の部分に戻すことができるようにしたいと考えています。

言い換えれば、 同じ質問const google::protobuf Message*です。解析後、メッセージが実際には a であることがわかります(そして、プログラムはクラスについて知っています)。どうにかしてを aに変換できますか?google::protobuf::compiler::Importergoogle::protobuf::DynamicMessageFactoryTestMessageMessage*TestMessage

メッセージを単純化することはできません。メッセージがジェネラルで解析された場合、dynamic_castキャストの結果は常に、これらのメソッドがある種のプロキシ オブジェクトを返すだけで、実際のメッセージ クラスについて知ることができないためです。NULLMessage::ParseFromXXX

私も次のことを試しました:

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

しかし、それはprotobufが「異なるタイプのメッセージをマージしようとしています」と言って失敗します。tr->GetTypeName()message->GetTypeName()do は同じ型名を返すことに注意してください 。

助けてくれてありがとう

4

1 に答える 1

0

TestMessage は実際に Message を継承していますか? dynamic_castが nullを返すという事実は、そうでないことを示唆しています。つまり、クラスは無関係であり、あるクラスから別のクラスにキャストしようとしても意味がありません。または、プライベート継承を使用している可能性があります。

于 2013-01-09T09:11:22.787 に答える