【问题标题】:How to encode messages with “map” using google-protobuf in JavaScript? (protocol buffers)如何在 JavaScript 中使用 google-protobuf 对带有“map”的消息进行编码? (协议缓冲区)
【发布时间】:2020-10-23 17:35:09
【问题描述】:

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

根据谷歌指南,“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 方法与地图进行交互。

【问题讨论】:

    标签: javascript protocol-buffers grpc-node


    【解决方案1】:

    这是一个例子:

    ma​​p-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
    

    ma​​p-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 对等。查看these map tests 以获取更多示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      相关资源
      最近更新 更多