protobuf сериализация языковых структур данных
-
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.
Однако у этой техники есть свои недостатки. Чтобы назвать несколько:
<Ол>Но - он выполняет работу за короткий срок.