首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在protobuf中实现类型转换

如何在protobuf中实现类型转换
EN

Stack Overflow用户
提问于 2015-06-03 12:39:49
回答 2查看 4.6K关注 0票数 1

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

例如:

在test.proto中

代码语言:javascript
运行
复制
Message Wrapper {
    required Type type =1;
    optional MessageType1 msg1 =2;
    optional MessageType2 msg2 =3;
}

和SendData.cpp

代码语言:javascript
运行
复制
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&)

关于如何解决这个问题,有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2015-06-04 01:40:59

您应该执行常规的C++ static_cast,即:

代码语言:javascript
运行
复制
msg1.CopyFrom(static_cast<MessageType1&>(proto));

注意,这当然需要输入消息实际上是这种类型的,如果不是,它将崩溃。你可以使用dynamic_cast在运行时验证转换是安全的,但这需要启用RTTI,它可能会很慢。

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

代码语言:javascript
运行
复制
msg1.ParseFromString(proto.SerializeAsString());

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

票数 1
EN

Stack Overflow用户

发布于 2015-06-03 14:26:28

Copyfrom希望收到MessageType1

看起来您正在尝试发送到CopyFrom MessageLite,而不是MessageType1

(顺便说一句,如果你发送了所有的原型文件,我们可能会看到什么是MessageLite,目前我只能猜测这是你的原型中的另一个信息)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30610982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档