protobuf.JS переводит файл proto в дескриптор JSON, повторяется теряется

я использую Protobuf.js построить пакет узла, содержащий наш протокол и предлагающий функции кодирования и декодирования для сообщений Proto, определенных в этом пакете. Я был бы в порядке с использованием .файлы proto (загрузка .proto файлы происходят во время выполнения), но так как модуль должен использоваться на стороне клиента, и я не могу упаковать .файлы proto для моего разрешения .js-файл (построенный с browserify), мне нужно использовать способ, который позволяет упаковку в сборке.js.

введите дескрипторы JSON.

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

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

файл json может быть упакован (требование разрешено browserify). Определения типа Proto также возможны внутри .в JSON

я перевел мой .прото файл в a .JSON-файл и попробовал его с моим примером данных. к сожалению, это не удалось с повторяющимися полями.

The .файл 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": {}
    },
    ...

Я также изучил свой корень, чтобы узнать, как выглядит загруженный тип, и он выглядит точно так же, как мое определение за исключением, что повторное отсутствует:

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

как определить повторяющееся поле правильно в дескрипторе JSON?

если есть способ предварительно включить файлы proto и не загружать их во время выполнения, чтобы я мог обернуть их browserify, я бы принял это как решение.

1 ответов


после просмотра кода я обнаружил, что вы не можете установить требуемый в дескрипторе JSON. Правильный способ-установить "rule": "repeated"; так как поле установлено с Поле Дескриптор