Подтвердить что ты не робот

Существует ли стандартное сопоставление между JSON и протокольными буферами?

Из комментария на объявление в блоге:

Относительно JSON: JSON структурирован аналогично протокольным буферам, но бинарный формат буфера протокола по-прежнему меньше и быстрее для кодирования. JSON делает отличную кодировку текста для буферов протоколов, хотя - это тривиально писать кодировщик/декодер который преобразует произвольный протокол сообщения от JSON и с помощью протобуф-отражение. Это хорошо способ общения с приложениями AJAX, так как пользователь загружает полный декодер protobuf, когда они посещают ваш страница может быть слишком большой.

Может быть тривиально приготовить сопоставление, но существует ли одно "очевидное" сопоставление между ними, что, естественно, будут согласованы две отдельные команды разработчиков? Если два продукта поддерживают данные PB и могут взаимодействовать, потому что они разделяют одну и ту же спецификацию .proto, интересно, смогут ли они по-прежнему взаимодействовать, независимо от того, будут ли они независимо представлять JSON-отражение одной и той же спецификации. Могут быть приняты некоторые произвольные решения, например. должны ли перечисляемые значения быть представлены строкой (чтобы быть читаемым человеком a la типичным JSON) или их целочисленным значением?

Итак, существует ли установленное сопоставление и любые реализации с открытым исходным кодом для генерации кодировщика/декодера JSON из спецификаций .proto?

4b9b3361

Ответ 1

Да, поскольку протокольные буферы версии 3.0.0 (выпущенные 28 июля 2016 г.) "Хорошо определенная кодировка в JSON в качестве альтернативы двоичному прото кодирование ", как указано в примечаниях к выпуску

https://github.com/google/protobuf/releases/tag/v3.0.0

Ответ 3

Из того, что я видел, Protostuff - это проект, который будет использоваться для любой работы PB на Java, включая сериализацию его как JSON, основанный на определении протокола. Я не использовал его сам, просто слышал хорошие вещи.

Ответ 4

Мне нужно было маршалировать GeneratedMessageLite на объект JSON, но не нужно было его развязывать. Я не мог использовать библиотеку protobuf в Pangea, потому что она не работает с параметром LITE_RUNTIME. Я также не хотел обременять нашу и без того большую систему устаревания с генерацией более скомпилированного кода для существующих буферов протокола. Для mashalling для JSON я пошел с этим простым решением для маршала

    final Person gpb = Person.newBuilder().setName("Bill Monroe").build();
    final Gson gson = new Gson();
    final String jsonString = gson.toJson(gpb);

Ответ 5

Еще одна мысль: если объекты protobuf имеют геттеры/сеттеры или соответственно названные поля, можно просто использовать Jackson привязка данных к процессору JSON, По умолчанию он обрабатывает общедоступные геттеры, любые сеттеры и общедоступные поля, но это только уровни видимости по умолчанию и могут быть изменены. Если это так, Джексон может сериализовать/десериализовать protobuf сгенерированные POJO без проблем.

Я действительно использовал этот подход с объектами, созданными с помощью Thrift; единственное, что мне нужно было настроить, - отключить сериализацию различных методов isXXX(), которые Thrift добавляет для проверки того, было ли поле явно назначено или нет.

Ответ 6

Прежде всего, я думаю, что нужно очень тщательно рассуждать о том, чтобы приложить усилия к преобразованию набора данных в протобафы. Здесь мои причины для преобразования набора данных в protobuffs

  • Тип Безопасность: гарантия на формат рассматриваемых данных.
  • несжатая память - печать данных. Причина, о которой я упоминаю, не сжата, заключается в том, что пост-сжатие не сильно отличается от размера сжатого и сжатого сжатого JSON, но сжатие связано с его стоимостью. Кроме того, скорость сериализации/де-сериализации почти одинакова, infact Jackson json быстрее, чем protobuffs. Пожалуйста, проверьте следующую ссылку для получения дополнительной информации. http://technicalrex.com/2014/06/23/performance-playground-jackson-vs-protocol-buffers/
  • Протоколы должны быть переданы по сети.

Говоря о том, что как только вы преобразуете свой набор данных в формат Jackson JSON таким образом, как определено определение ProtoBuff, его можно легко напрямую сопоставить с форматом ProtoBuff, используя функцию Protostuff: JsonIoUtil: mergeFrom. Подпись функции:

public static <T> void mergeFrom(JsonParser parser, T message, Schema<T> schema,  boolean numeric) 

Ссылка на protostuff