c++ - C++ 中的 protobuf 与 google::protobuf::Message 的动态绑定(bind)

标签 c++ protocol-buffers

在 C++ 中使用 protobuf,我有一系列消息将共享一对编码和解码自定义 API,例如 Pack() 和 Unpack();

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

由于不支持继承,因此我查看了Any 工具。但是,官方文档过于简洁,无法通过工作示例来指导我。

我想确认 Any 是否像这样工作:

假设我需要从解码器端的工厂创建一些消息类型,那么......

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

syntax = "proto3";

import "google/protobuf/any.proto";

message Envelope {
   google.protobuf.Any actual_msg = 1;
   string id = 2;
}

message PublicProfile {
   string name = 1;
   int32 age = 2;
   bool isMale = 3;
}

message PrivateProfile {
   string nickname = 1;
   int32 money = 2;
}

第 2 步:编码器将像这样工作

//encoder.cpp

Envelope payload;
payload.set_id("my.com/msg/profile.public");
PublicProfile pp;
pp.name = "Tom";
pp.age = 30;
pp.isMale = true;
payload.get_actual_msg().PackFrom(pp); // NOT Sure how to use PackFrom at all!


int pakSize = payload.ByteSize()
std::string packet(pakSize, '\0');
google::protobuf::io::ArrayOutputStream aos((void*)packet.c_str(), pakSize);
google::protobuf::io::CodedOutputStream* cos = new google::protobuf::io::CodedOutputStream(&aos);
payload.SerializeToCodedStream(cos);

第三步:最后解码器需要

// decoder.cpp

Envelope payload;
google::protobuf::io::ArrayInputStream ais(packet.c_str(), packet.size());
google::protobuf::io::CodedInputStream cis(&ais);
payload->ParseFromCodedStream(&cis);
google::protobuf::Any actual_msg = payload.actual_msg();
if (payload.id() == "my.com/msg/profile.public") {
    PublicProfile pp;
    actual_msg.UnpackTo(&pp);
}

它是这样工作的吗?

最佳答案

由于没有人愿意回答,我将报告我自己的发现。

我们不需要协议(protocol)中的显式 ID。 Any 都有一个内置的 ID,由 Protobuf 自动生成。

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

myAnyMsg.type_url()

典型的 URL 如下所示

type.googleapis.com/<message_type_defined_in_proto>

关于c++ - C++ 中的 protobuf 与 google::protobuf::Message 的动态绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58487116/

相关文章:

c++ - 无法使用指针打印二维矩阵的值

c++ - 如何在 C++ 中初始化需要参数的结构数组

c++ - 使用 "find"访问 vector 中的值

时间:2019-05-17 标签:c++win32: basic string handling

python - apache-beam 从 GCS 桶的多个文件夹中读取多个文件并加载它 bigquery python

c++ - 遍历所有字段并在 protobuf 消息中获取它们的值

c++ - 动态字符串数组分配错误

protocol-buffers - 谷歌 protobuf : if I add field from one side will it break another one?

java.lang.IndexOutOfBoundsException - 使用 Protocol buffer 构建 Java 对象时

inheritance - 扩展Protobuf消息