2013-01-06 1 views
2

Скажем, мы хотим создать наше сообщение, не используя какие-либо существующие ранее .proto-файлы и скомпилированные из них файлы cpp/cxx/h. Мы хотим использовать protobuf строго как библиотеку. Например, мы получили (в некотором только известном нам формате) описание сообщения: сообщение MyMessage должно иметь MyIntFiels и дополнительно MyStringFiels. Как создать такое сообщение? например, заполнить его простым сохранением данных до .bin и прочитать из этого двоичного его содержимого обратно?Как создать динамическое сообщение с помощью буферов протокола?

Я просмотрел все dynamic_message.h help description и DescriptorPool и т. Д., Но не вижу, как добавлять/удалять поля в сообщении, а также не добавлять к описанию сообщения fly в DescriptorPool.

Может ли кто-нибудь объяснить это?

ответ

2

Короткий ответ: его нельзя использовать таким образом.

overview page из Protobuf говорит:

XML также - в какой-то степени - самоописываемыми. Буфер протокола имеет смысл только в том случае, если у вас есть определение сообщения (файл .proto).

Смысл всей цели Protobuf заключается в том, чтобы отбросить самооценку в пользу скорости разбора ==> Это просто не цель создания самоописательных сообщений.

Рассмотрите возможность использования XML или JSON или любого другого формата сериализации. Если защита необходима, вы можете использовать симметричное шифрование и/или сжатие lzip.

+1

Неправда. [dynamic_message.h] (https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.dynamic_message) 'Определяет реализацию сообщения, которое может эмулировать типы, которые неизвестны во время компиляции . – myWallJSON

+2

Проблема в том, что если я правильно понимаю документацию, она используется для динамического разбора сообщений, а не для создания динамических сообщений. См. [Здесь] (https://developers.google.com/protocol-buffers/docs/techniques#self-description): «Используя такие классы, как DynamicMessage (доступно на C++ и Java), вы можете писать инструменты, которые могут манипулировать SelfDescribingMessage». Я не совсем прав по поводу возможности самоописания, признаюсь, но совет держится. – DarkWanderer

+0

Мы можем генерировать на лету файл как 'сообщение MyMessage {int32 MyIntFiels = 1; string MyStringFiels = 2;} 'как передать такую ​​строку? – myWallJSON

Смежные вопросы