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

Posted

技术标签:

【中文标题】您将如何使用协议缓冲区对 Map<String, Object> 进行编码?【英文标题】:How would you encode a Map<String, Object> using Protocol Buffers? 【发布时间】:2009-07-09 09:51:52 【问题描述】:

我正在尝试使用Protocol Buffers 进行消息序列化。

我的消息格式应该包含 Map 条目...但是如何编写 .proto 定义?

据我所知,Protocol Buffers 没有内置的 Map 类型。我可以使用重复字段来模拟它。但我遇到的最大问题是,您需要定义所有类型。我希望我的消息灵活,所以我不能指定类型。

有什么想法吗?

【问题讨论】:

为了它的价值:现在看来'proto3'有maps&lt;,&gt;语法:developers.google.com/protocol-buffers/docs/proto3#maps 【参考方案1】:

我会用一个键和一个值来建模一个元组(可能值可能是每种类型的一个值字段)。然后只需要该元组类型的重复列表。您需要在代码中构建地图本身。

当您说您无法指定类型时,您指的是哪种类型?如果您在元组中具有每种类型的可选字段,那么这将适用于所有原语 - 您可以通过将消息序列化为字节字符串来映射消息。

听起来你的“非结构化”水平可能不适合 PB。

【讨论】:

听起来很合理......但我想你是对的:PB 看起来不太适合我的问题 @artuh - 你最终用什么来解决你的问题? @FranzéJr.:鉴于您没有提出任何不同的要求,为什么您会期待不同的信息?协议缓冲区现在支持映射的概念,但不支持“通用消息” - 它必须是特定类型。 @Jon Skeet 现在在 Protobuf 3 中执行此操作的方法是使用其众所周知的 Struct 类型:developers.google.com/protocol-buffers/docs/reference/… 这将是今天执行此操作的“更好”方法,并且实际上是您在您的回答中描述。 @PragmaticProgrammer:Struct 非常适合 JSON 建模,因为它专门就是为了这个。另一个选项是Any,如果每个值实际上都是另一个 protobuf 消息。 (当然,protobuf 现在确实有地图......)

以上是关于您将如何使用协议缓冲区对 Map<String, Object> 进行编码?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用命名查询返回 Map<key,value>?

对缓冲区大小施加限制

cppcheck 抱怨缓冲区被越界访问。为啥以及如何解决?

Google Protocol Buffers - 对编码解码 base64 char * c 字符串协议缓冲区数据感到困惑

map的使用

如何动态分配正确的消息来解码协议缓冲区消息?