gpt4 book ai didi

javascript - protobuf.js 将 proto 文件转换为 JSON 描述符,重复会丢失

转载 作者:数据小太阳 更新时间:2023-10-29 04:15:28 29 4
gpt4 key购买 nike

我正在使用 Protobuf.js构建一个节点包,其中包含我们的协议(protocol)并为该包中定义的 Proto Messages 提供编码和解码功能。我可以使用 .proto 文件(.proto 文件的加载发生在运行时),但由于模块需要在客户端可用,我无法将 .proto 文件打包到我解析的 .js 文件中(使用 browserify 构建),我需要使用一种方法,在 build.js 中启用打包。

输入 JSON 描述符。

var jsonDescriptor = require("./awesome.json"); // exemplary for node

var root = protobuf.Root.fromJSON(jsonDescriptor);

json文件可以打包(browserify解决需求)。 .json 中也可以使用原型(prototype)类型定义

我将我的 .proto 文件翻译成一个 .json 文件,并用我的示例数据进行了尝试。 不幸的是,它因重复字段而失败。

.proto 文件看起来像这样:

message Structure {
map <int32, InnerArray> blocks = 1;
}

message Inner{
int32 a = 1;
int32 b = 2;
bool c = 3;
}

message InnerArray{
repeated Inner inners = 1;
}

我将其翻译成这个 JSON 描述符

{
"nested": {
"Structure": {
"fields": {
"blocks": {
"type": "InnerArray",
"id": 1,
"map" : true,
"keyType" : "int32"
}
}
},
"InnerArray" : {
"fields": {
"inners" : {
"repeated" : true,
"type" : "Inner",
"id" : 1
}
}
},
"Inner" : {
"fields" : {
"a" : {
"type" : "int32",
"id" : 1
},
"b" : {
"type" : "int32",
"id" : 2
},
"c" : {
"type" : "bool",
"id" : 3
}
}
}
}
}

如果我没记错的话,这里是 required字段的属性。

当我对我的示例数据进行编码和解码时,它会在重复字段处停止:(请注意 map 工作正常)。

{
"blocks": {
"0": {
"inners": {}
},
...

我还检查了我的根以了解加载类型的外观,它看起来与我的定义 EXCEPT 完全一样,但 repeated 丢失了:

"InnerArray" : {
"fields": {
"inners" : {
"type" : "Inner",
"id" : 1
}
}
},

如何在 JSON 描述符中正确定义重复字段?

如果有一种方法可以预先包含原型(prototype)文件而不是在运行时加载它们,这样我就可以用 browserify 包装它们,我也会接受这个作为解决方案。

最佳答案

浏览代码后,我发现您无法在JSON Descriptor 中设置required。正确的方法是设置“规则”:“重复”;因为字段设置为 Field Descriptor

关于javascript - protobuf.js 将 proto 文件转换为 JSON 描述符,重复会丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44328792/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com