你如何在protobuf中实现类型铸造

时间:2015-06-03 04:39:49

标签: protocol-buffers

我在包装器下定义了不同的消息类型。

例如:

在test.proto

Message Wrapper {
    required Type type =1;
    optional MessageType1 msg1 =2;
    optional MessageType2 msg2 =3;
}

和SendData.cpp

sendData(int type, google::protobuf::MessageLite& proto) {
MessageWrapper wrapper;
wrapper.set_type(type);
switch (type) {
case type1:
     MessageType1* msg1 = wrapper.mutable_msg1();
     msg1.CopyFrom(proto);
     break;  
 }
case type2:
//

}

在这种情况下,CopyFrom会向我发出错误,没有匹配功能 - 候选人是MessageType1::CopyFrom(const MessageType1&)

关于如何解决此问题的任何指示?

2 个答案:

答案 0 :(得分:0)

Copyfrom预计会收到 MessageType1 您似乎尝试发送到CopyFrom MessageLite 而不是 MessageType1

(顺便说一句,如果您发送所有原型文件,我们可能会看到什么是MessageLite,目前我只能猜测它在原型中的另一条消息)

答案 1 :(得分:0)

你应该做一个普通的C ++ static_cast,即:

msg1.CopyFrom(static_cast<MessageType1&>(proto));

请注意,这当然要求输入消息实际上是这种类型,如果它不是,它将崩溃。您可以使用dynamic_cast代替在运行时验证强制转换是否安全,但这需要启用RTTI,而且速度可能很慢。

如果您希望输入消息实际上不是C ++类型MessageType1,但是是线格式兼容类型,那么您可以尝试:

msg1.ParseFromString(proto.SerializeAsString());

即。序列化然后重新解析。当然,这将是非常缓慢的。不要忘记检查错误返回。