如何使用协议缓冲区创建动态消息?

Posted

技术标签:

【中文标题】如何使用协议缓冲区创建动态消息?【英文标题】:How to create a dynamic message with Protocol Buffers? 【发布时间】:2013-01-06 17:21:24 【问题描述】:

假设我们想创建我们的消息而不使用任何预先存在的 .proto 文件并从它们编译出 cpp/cxx/h 文件。我们希望将 protobuf 严格用作库。例如,我们得到(以某些只有我们知道的格式)消息描述:名为MyMessage 的消息必须有MyIntFiels 和可选的MyStringFiels。如何创建这样的消息?例如用保存到.bin 的简单数据填充它并从该二进制文件中读取其内容?

我查看了dynamic_message.h help description 和 DescriptorPool 等,但没有看到如何在消息中添加/删除字段,也没有办法将描述的动态消息添加到 DescriptorPool。

谁能解释一下?

【问题讨论】:

developers.google.com/protocol-buffers/docs/… 【参考方案1】:

简短回答:不能那样使用。

Protobuf 的overview page 说:

XML 在某种程度上也是自描述的。仅当您拥有消息定义(.proto 文件)时,协议缓冲区才有意义。

意味着 Protobuf 的全部意义在于抛弃自我描述性以支持解析速度 ==> 创建自我描述消息并不是它的目的。

考虑使用 XML 或 JSON 或任何其他序列化格式。如果需要保护,您可以使用对称加密和/或 lzip 压缩。

【讨论】:

不正确。 dynamic_message.hDefines an implementation of Message which can emulate types which are not known at compile-time. 问题是,如果我正确理解文档,它用于动态解析消息,而不是动态创建消息。请参阅here:“通过使用 DynamicMessage 之类的类(在 C++ 和 Java 中可用),您可以编写可以操作 SelfDescribeingMessage 的工具”。我承认,我对自我描述的可能性并不完全正确,但建议仍然有效。 我们可以生成像message MyMessage int32 MyIntFiels = 1; string MyStringFiels = 2;这样的动态文件,如何将这样的字符串提供给它? 你为什么不直接发送和 JSON 一样的呢?通过将其与标头一起放入 protobuf 消息格式,您将一无所获。 查看 Confluent Schema 注册表 5.5+ 版本中的 protobuf 支持

以上是关于如何使用协议缓冲区创建动态消息?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 Google 协议缓冲区:从现有结构创建消息

与 JSON 相比,作为协议缓冲区发送时消息的大小如何减小

您将如何使用协议缓冲区对 Map<String, Object> 进行编码?

进出 XPathDocument 的协议缓冲区消息

从套接字读取消息时如何获取字节序?

您如何管理协议缓冲区定义文件?