我正在使用
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包装它们,我也会接受它作为解决方案.
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。