我正在使用
Protobuf.js构建一个节点包,其中包含我们的协议,并为此包中定义的Proto消息提供编码和解码功能.我可以使用.proto文件(在运行时加载.proto文件),但由于模块需要在客户端可用,我无法将.proto文件打包到我已解析的.js文件(使用browserify构建),我需要使用一种方法,在build.js中启用打包.
输入JSON描述符.
var jsonDescriptor = require("./awesome.json"); // exemplary for node var root = protobuf.Root.fromJSON(jsonDescriptor);
可以打包json文件(需要通过browserify解析). Proto Type Defintions也可以在.json中使用
我将.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 } } } } }
当我对我的示例数据进行编码和解码时,它会在重复的字段处停止:(注意地图工作正常).
{ "blocks": { "0": { "inners": {} },...
我还检查了我的root以了解加载类型的外观,它看起来与我的定义完全相同,除了重复丢失:
"InnerArray" : { "fields": { "inners" : { "type" : "Inner","id" : 1 } } },
如何在JSON描述符中正确定义重复字段?
如果有一种方法可以预先包含proto文件并且不在运行时加载它们,那么我可以用browserify包装它们,我也会接受它作为解决方案.