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