protobuf сериализация языковых структур данных - PullRequest
2 голосов
/ 17 ноября 2008

Используя Google Protocul Buffers , у меня уже есть служба, написанная на Java, которая уже имеет свои собственные структуры данных. Я хотел бы использовать pb для доставки сообщений, и я ищу способ сериализации существующих структур данных, которые у меня есть в Java, для pb. Я могу начать с определения всех структур данных в pb с нуля, что, вероятно, является правильным путем, но я слишком ленив. Итак, скажем, у меня есть класс Person в Java (или других поддерживаемых языках) или класс Plane, в котором есть десятки атрибутов, есть ли способ сериализации этого класса в pb? Могу ли я иметь атрибут pb типа Plane? (когда Plane не pb, это класс Java)

Ответы [ 2 ]

3 голосов
/ 17 ноября 2008

Нет, вы не можете. Поля в сообщениях protobuf - это всегда примитивы (в основном, числа, строки и байтовые массивы), перечисления protobuf (которые генерируются как перечисления Java) или сообщения protobuf - и, конечно же, повторяющиеся версии всех них.

Вы могли бы потенциально написать инструмент, который использовал бы отражение для создания файла .proto из класса Java, но я подозреваю, что вы найдете его быстрее, просто сделав это вручную. В частности, если вы действительно использовали отражение, вы должны убедиться, что поля всегда генерируются с одним и тем же именем, чтобы обеспечить совместимость. Одна вещь, которую вы могли бы сделать, это комментировать классы Java и писать код для генерации файла .proto на основе этих аннотаций - или даже потенциально сериализовать напрямую в формат прото с использованием аннотаций. Лично я бы рекомендовал создавать файл .proto некоторым способом, а не эффективно переписывать проект PB - в противном случае существует значительный риск появления ошибок там, где уже полностью протестирован код.

Если вы создадите систему аннотаций, я уверен, что Кентон Варда (и остальная часть сообщества PB) были бы заинтересованы в ее просмотре.

0 голосов
/ 23 ноября 2008

Один из способов, который я могу придумать, - это иметь строковое поле в protobuf и сериализовать класс Java в это поле, используя примитивную сериализацию Java. Таким образом, предполагая, что получатель сообщения знает, как его прочитать / десериализовать, я могу легко сериализовать сообщения Java в Java.

Однако у этой техники есть свои недостатки. Чтобы назвать несколько:

  1. Это только Java на Java (без C ++, Python или других)
  2. Он не так эффективен, как нативные protobufs (ни для разбора / сериализации, ни для размера сообщения)
  3. У вас есть логика структур данных, разбросанных по нескольким местам, некоторые находятся в файле определения protobufs, некоторые в других классах Java, и это усложняет обслуживание.

Но - он выполняет работу за короткий срок.

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