1

我想问一下如何编码(序列化)地图字段。

根据谷歌指南,“JavaScript 生成代码”包含以下地图字段功能。生成解码函数 ( getFooMap())。但是我在任何地方都找不到地图类型的编码功能或指南。(我以为会有类似的功能setXXXMap(),但我找不到。)

我应该如何编码地图字段?

https://developers.google.com/protocol-buffers/docs/reference/javascript-generated#map

地图字段

对于此带有地图字段的消息:

message Bar {}

message Baz {
  map<string, Bar> foo = 1;
}

编译器生成以下实例方法:

getFooMap():返回包含 foo 的键值对的 Map。然后,您可以使用 Map 方法与地图进行交互。

4

1 回答 1

4

这是一个例子:

地图-test.proto

syntax = "proto3";

package test;

message Table {
    string label = 1;
    map<string, int32> data = 2;
}

生成protobuf:

$ protoc --js_out=import_style=commonjs,binary:. ./map-test.proto

地图-test.js

var proto = require('./map-test_pb');

// Serialization

var msg = new proto.Table();
msg.setLabel("Test");
msg.getDataMap().set("a", 1);
msg.getDataMap().set("b", 2);
msg.getDataMap().set("c", 3);

var serialized = msg.serializeBinary();

// Deserialization

var deserialized = proto.Table.deserializeBinary(serialized);
console.log(deserialized.getLabel());

deserialized.getDataMap().forEach(function(v, k) {
    console.log(k, v);
});

// console.log(deserialized.getDataMap().entries());
// console.log(deserialized.getDataMap().get("a"));

输出:

Test
a 1
b 2
c 3

您可以使用地图的set()get()方法来存储和检索值;forEach()遍历所有 KV 对等。查看这些地图测试以获取更多示例。

于 2020-07-03T05:56:56.927 回答