C+中的protobuf+;使用google::protobuf::Message的动态绑定 在C++中使用OrthBufff,我有一系列的消息,它们将共享一对编码和解码自定义API,例如PACK()和unCube()。p>

C+中的protobuf+;使用google::protobuf::Message的动态绑定 在C++中使用OrthBufff,我有一系列的消息,它们将共享一对编码和解码自定义API,例如PACK()和unCube()。p>,c++,protocol-buffers,C++,Protocol Buffers,但我很快意识到,我必须对消息类型进行硬编码,以便能够将数据从流解码为正确的数据结构 由于不支持继承,因此我接着研究了Any功能。然而,官方文件过于简洁,无法用一个工作示例来指导我 我想确认是否有类似的工作: 比如说,如果我需要从解码器端的工厂创建一些消息类型,那么 第一步:我必须这样定义我的proto3 type.googleapis.com/<message_type_defined_in_proto> syntax=“proto3”; 导入“google/protobuf/an

但我很快意识到,我必须对消息类型进行硬编码,以便能够将数据从流解码为正确的数据结构

由于不支持继承,因此我接着研究了
Any
功能。然而,官方文件过于简洁,无法用一个工作示例来指导我

我想确认是否有类似的工作:

比如说,如果我需要从解码器端的工厂创建一些消息类型,那么

第一步:我必须这样定义我的proto3

type.googleapis.com/<message_type_defined_in_proto>
syntax=“proto3”;
导入“google/protobuf/any.proto”;
信息信封{
google.protobuf.Any实际_msg=1;
字符串id=2;
}
消息公共配置文件{
字符串名称=1;
int32年龄=2岁;
布尔伊斯梅尔=3;
}
消息私有配置文件{
字符串昵称=1;
int32货币=2;
}
步骤2:编码器的工作原理如下

type.googleapis.com/<message_type_defined_in_proto>
//encoder.cpp
包络有效载荷;
payload.set_id(“my.com/msg/profile.public”);
公共档案pp;
pp.name=“汤姆”;
pp.年龄=30岁;
pp.isMale=true;
payload.get_actual_msg().PackFrom(pp);//根本不知道如何使用PackFrom!
int pakSize=payload.ByteSize()
std::字符串数据包(pakSize,'\0');
google::protobuf::io::ArrayOutputStream aos((void*)packet.c_str(),pakSize);
google::protobuf::io::CodedOutputStream*cos=新的google::protobuf::io::CodedOutputStream(&aos);
有效载荷.序列化到代码流(cos);
步骤#3:最后解码器需要

//decoder.cpp
包络有效载荷;
google::protobuf::io::ArrayInputStream ais(packet.c_str(),packet.size());
google::protobuf::io::CodedInputStream CI(&ais);
有效负载->从代码流解析(&CI);
google::protobuf::Any-actual_-msg=payload.actual_-msg();
if(payload.id()=“my.com/msg/profile.public”){
公共档案pp;
实际信息解包到(&pp);
}

它是这样工作的吗?

既然没有人愿意回答,我就报告我自己的发现

协议中不需要显式ID<代码>任何都内置了一个ID,由Protobuf自动生成

解码时,只需调用指定的方法从
Any
对象检索ID,我们就可以自由地将其与任何自定义模式进行匹配

myAnyMsg.type\u url()
典型的URL如下所示

type.googleapis.com/<message_type_defined_in_proto>
type.googleapis.com/