Какие разделители используются для протобуф-сообщений? - PullRequest
0 голосов
/ 14 сентября 2018

Что такое разделители для сообщений protobuf? Я работаю с сериализованными сообщениями. Я хотел бы знать, начинаются ли сообщения с $$ __ $$ и заканчиваются тем же знаком.

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

Формат протокола Protocol Buffer не является саморазграничением, поэтому синтаксические анализаторы буфера протокола не могут самостоятельно определить, где заканчивается сообщение. Самый простой способ решить эту проблему - записать размер каждого сообщения перед тем, как написать само сообщение. Когда вы читаете сообщения обратно, вы читаете размер, затем считываете байты в отдельный буфер, а затем анализируете этот буфер.

0 голосов
/ 15 сентября 2018

(В дополнение к существующим ответам 1 , 2 )

Общий метод кадрирования для буферов протокола заключается в добавлении varint перед фактическимсообщение protobuf. * ​​1009 *

Реализация уже является частью библиотеки protobuf, например:

Удачи в вашем проекте!

EDIT> Официальная ссылка гласит:

Если вы хотите написатьНесколько сообщений в одном файле или потоке, вы должны отслеживать, где заканчивается одно сообщение и начинается следующее.Формат протокола Protocol Buffer не является саморазграничением, поэтому синтаксические анализаторы буфера протокола не могут самостоятельно определить, где заканчивается сообщение.Самый простой способ решить эту проблему - записать размер каждого сообщения перед тем, как написать само сообщение.Когда вы читаете сообщения обратно, вы читаете размер, затем читаете байты в отдельный буфер, а затем анализируете этот буфер.(Если вы хотите избежать копирования байтов в отдельный буфер, проверьте класс CodedInputStream (как на C ++, так и на Java), который может указывать ограничивать чтение определенным количеством байтов.)

0 голосов
/ 14 сентября 2018

Для сообщений верхнего уровня (то есть отдельных вызовов для сериализации): буквально их нет. Если вы не добавите свое собственное обрамление, сообщения будут активно перетекать друг в друга, поскольку десериализатор будет (по умолчанию) просто читать до конца потока. Итак: если вы слепо объединили несколько объектов без собственного протокола кадрирования: у вас теперь есть проблемы.

Для внутренних сообщений существует два способа кодирования подобъектов - префикс длины и группы. Группы в значительной степени устарели, а кодировка подобъектов неоднозначна в том смысле, что это также те же маркеры, которые описывают строки, большие двоичные объекты (байты) и «упакованные массивы». Вы, вероятно, не хотите пытаться справиться с этим.

Итак: звучит так, как будто вам нужно добавить свой собственный протокол кадрирования, и в этом случае ответ будет: каким бы ни был ваш протокол кадрирования. Просто помните, что protobuf является двоичным, поэтому вы не можете полагаться на какую-либо последовательность байтов в качестве сторожа / терминатора. Вместо этого лучше использовать подход с префиксом длины.

...