This答案清楚地显示了原始文本解析的一些示例,但没有地图的示例. 如果一个原型有: mapint32, string aToB 我猜是这样的: aToB { 123: "foo"} 但它不起作用.有谁知道确切的语法? 我最初尝试从
如果一个原型有:
map<int32, string> aToB
我猜是这样的:
aToB { 123: "foo" }
但它不起作用.有谁知道确切的语法?
我最初尝试从 earlier answer推断,这让我误入歧途,因为我错误地认为多个k / v对看起来像这样:aToB { # (this example has a bug) key: 123 value: "foo" key: 876 # WRONG! value: "bar" # NOPE! }
这导致了以下错误:
libprotobuf ERROR: Non-repeated field "key" is specified multiple times.
适用于多个键值对的语法:
(注意:我使用的是协议缓冲区语言的“proto3”版本)
aToB { key: 123 value: "foo" } aToB { key: 876 value: "bar" }
在重新阅读this relevant portion of the proto3 Map documentation之后重复地图变量名称的模式更有意义,这解释了地图等同于定义您自己的“对”消息类型,然后将其标记为“重复”.
一个更完整的例子:
原型定义:
syntax = "proto3"; package myproject.testing; message UserRecord { string handle = 10; bool paid_membership = 20; } message UserCollection { string description = 20; // HERE IS THE PROTOBUF MAP-TYPE FIELD: map<string, UserRecord> users = 10; } message TestData { UserCollection user_collection = 10; }
配置文件中的文本格式(“pbtxt”):
user_collection { description = "my default users" users { key: "user_1234" value { handle: "winniepoo" paid_membership: true } } users { key: "user_9b27" value { handle: "smokeybear" } } }
C将以编程方式生成消息内容
myproject::testing::UserRecord user_1; user_1.set_handle("winniepoo"); user_1.set_paid_membership(true); myproject::testing::UserRecord user_2; user_2.set_handle("smokeybear"); user_2.set_paid_membership(false); using pair_type = google::protobuf::MapPair<std::string, myproject::testing::UserRecord>; myproject::testing::TestData data; data.mutable_user_collection()->mutable_users()->insert( pair_type(std::string("user_1234"), user_1)); data.mutable_user_collection()->mutable_users()->insert( pair_type(std::string("user_9b27"), user_2));