Есть ли стандартное отображение между JSON и буфером протокола? - PullRequest
26 голосов
/ 30 марта 2010

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

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

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

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

Ответы [ 6 ]

7 голосов
/ 21 июля 2010

Может быть, это полезно http://code.google.com/p/protobuf-java-format/

6 голосов
/ 23 июля 2010

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

3 голосов
/ 27 декабря 2017

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

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

2 голосов
/ 14 октября 2014

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

    final Person gpb = Person.newBuilder().setName("Bill Monroe").build();
    final Gson gson = new Gson();
    final String jsonString = gson.toJson(gpb);
1 голос
/ 18 мая 2012

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

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

0 голосов
/ 21 декабря 2015

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

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

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

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

Ссылка на protostuff

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...