protobuf сериализация языковых структур данных

StackOverflow https://stackoverflow.com/questions/295017

  •  08-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top