170 похожих чатов

Небольшой вопрос по protobuf. Вот отправил я три разных структуры

по сети, на другом конце их принял, как мне отличить какая из них что? Т.е. нужно заголовок в начале добавлять для этого или через if (::ParseFromString)? Или там есть что-то встроенное для этого?

23 ответов

3 просмотра

В протоколе ты описываешь разные структуры, они маркируются, когда шлются. ПО этим маркерам они читаются.

Michael-Chambers Автор вопроса
Ilya Zviagin
Про IF я не понял...

ну вот пришла мне строка, как понять из нее во что мне ее парсить?

Michael-Chambers Автор вопроса
Ilya Zviagin
Ты точно протобафом пользуешься?

https://developers.google.com/protocol-buffers/docs/cpptutorial#reading-a-message ну вот я посмотрел сюда и мне непонятно это

Там есть что-то встроенное для этого.

Michael Chambers
https://developers.google.com/protocol-buffers/doc...

Что тут тебе конкретно не понятно?

Michael Chambers
ну вот пришла мне строка, как понять из нее во что...

какой-то странный вопрос. У тебя их схемы уже будет готовый парсер, который сам "понимает", что и как парсить. Тебе просто надо просто, грубо говоря, по именам обращаться и работать с ними. или я вопроса не понял

Michael-Chambers Автор вопроса
Ilya Zviagin
Что тут тебе конкретно не понятно?

Там нет кейса когда пришла строка и из неё надо понять как ее парсить. Пока при помощи SO нашел https://developers.google.com/protocol-buffers/docs/proto3#any но не уверен что это оно

Michael Chambers
Там нет кейса когда пришла строка и из неё надо по...

Any - это совсем другое. Это если ты в рантайме хочешь типы зачем-то проверять (зачем - непонятно)

Michael-Chambers Автор вопроса
Michael Chambers
а как я в рантайме пойму что мне пришло?

как-то вот так: // Storing an arbitrary message type in Any. NetworkErrorDetails details = ...; ErrorStatus status; status.add_details()->PackFrom(details); // Reading an arbitrary message from Any. ErrorStatus status = ...; for (const Any& detail : status.details()) { if (detail.Is<NetworkErrorDetails>()) { NetworkErrorDetails network_error; detail.UnpackTo(&network_error); ... processing network_error ... } }

Michael-Chambers Автор вопроса
Alexander "SonnySlave" Zaitsev
как-то вот так: // Storing an arbitrary message ty...

Так это с Any с же, а как без него тогда?

Michael Chambers
Так это с Any с же, а как без него тогда?

без него у тебя есть уже сгенереный парсер из схемы, который сам всё это делает

Michael-Chambers Автор вопроса
Alexander "SonnySlave" Zaitsev
без него у тебя есть уже сгенереный парсер из схем...

Значит пока я куда-то не туда смотрю потому что не вижу этого

Michael Chambers
Значит пока я куда-то не туда смотрю потому что не...

я не эксперт великий по протобуфам, но можно делать вот так: пишешь свой враппер, в нём 2 поля. енум с типом мессаги и union из мессаг (возможно можно запихнуть в union - я не помню, надо перепроверить). на принимающей стороне парсишь это дело, смотришь на енум и исходя из значения парсишь нужной схемой

Michael-Chambers Автор вопроса
Alexander "SonnySlave" Zaitsev
я не эксперт великий по протобуфам, но можно делат...

Во, это мне тоже пришло в голову. Но как бы google умные ребята и я решил, что за меня давно всё придумали.

Michael Chambers
Во, это мне тоже пришло в голову. Но как бы google...

на правах оффтопа - для разнообразия можешь посмотреть на flatbuffers. О нём по какой-то неведомой мне причине незаслуженно редко вспоминают

Michael-Chambers Автор вопроса
Alexander "SonnySlave" Zaitsev
на правах оффтопа - для разнообразия можешь посмот...

на правах оффтопа, пока еще есть возможность сменить протокол. Только он предоставляет что-то такое?

Michael Chambers
на правах оффтопа, пока еще есть возможность смени...

такое - емнип тоже нет. там такую же схему надо делать. но ты проверь в flatbuffers, как union себя ведёт. мне кажется, что там сразу кодируется инфа о типе, которую вытянуть можно

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Вопрос по WIN32: Насколько я понимаю то все функции win32 привязаны к объектам операционной системы. Например консоль, файл, кисть, окна итд. Следовательно функции win32 упра...
Tommy Vercetti
6
Hello, can I install macOS and run flutter on a virtual machine? Is it possible to print for iphone?
Mazones
11
кто-то пользуется компонентами rx ? как их лучше ставить, через OPM? (lazarus)
Iluha Companets
15
Дороу! У кого-нибудь есть в загашнике проверенная функция экранирования, аналог re.escape в Python? Из доки: » Escape all the characters in pattern except ASCII letters and n...
Daniil Smolyakov
9
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
В смысле более затратная? Общая стоимость владения лошадью меньше, чем автомобиля. В среднем.
Sergej R
10
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
Карта сайта