protobuf文本格式解析图
protobuf text format parsing maps
This 答案清楚地显示了一些原型文本解析示例,但没有地图示例。
如果原型有:
map<int32, string> aToB
我猜是这样的:
aToB {
123: "foo"
}
但它不起作用。有人知道确切的语法吗?
文本格式为:
aToB {
key: 123
value: "foo"
}
我最初尝试从 推断,这让我误入歧途,因为我错误地认为多个 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后,重复映射变量名称的模式更有意义,这说明映射相当于定义自己的"pair"消息类型,然后将其标记为"repeated"。
更完整的例子:
原型定义:
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));
This 答案清楚地显示了一些原型文本解析示例,但没有地图示例。
如果原型有:
map<int32, string> aToB
我猜是这样的:
aToB {
123: "foo"
}
但它不起作用。有人知道确切的语法吗?
文本格式为:
aToB {
key: 123
value: "foo"
}
我最初尝试从
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后,重复映射变量名称的模式更有意义,这说明映射相当于定义自己的"pair"消息类型,然后将其标记为"repeated"。
更完整的例子:
原型定义:
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));