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

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

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

23 ответов

18 просмотров

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

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 себя ведёт. мне кажется, что там сразу кодируется инфа о типе, которую вытянуть можно

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта