по сети, на другом конце их принял, как мне отличить какая из них что? Т.е. нужно заголовок в начале добавлять для этого или через if (::ParseFromString)? Или там есть что-то встроенное для этого?
В протоколе ты описываешь разные структуры, они маркируются, когда шлются. ПО этим маркерам они читаются.
То есть через if (::ParseFromString)?
Про IF я не понял...
ну вот пришла мне строка, как понять из нее во что мне ее парсить?
Ты точно протобафом пользуешься?
https://developers.google.com/protocol-buffers/docs/cpptutorial#reading-a-message ну вот я посмотрел сюда и мне непонятно это
Там есть что-то встроенное для этого.
Что тут тебе конкретно не понятно?
какой-то странный вопрос. У тебя их схемы уже будет готовый парсер, который сам "понимает", что и как парсить. Тебе просто надо просто, грубо говоря, по именам обращаться и работать с ними. или я вопроса не понял
Там нет кейса когда пришла строка и из неё надо понять как ее парсить. Пока при помощи SO нашел https://developers.google.com/protocol-buffers/docs/proto3#any но не уверен что это оно
Any - это совсем другое. Это если ты в рантайме хочешь типы зачем-то проверять (зачем - непонятно)
а как я в рантайме пойму что мне пришло?
как-то вот так: // 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 ... } }
Так это с Any с же, а как без него тогда?
без него у тебя есть уже сгенереный парсер из схемы, который сам всё это делает
Значит пока я куда-то не туда смотрю потому что не вижу этого
я не эксперт великий по протобуфам, но можно делать вот так: пишешь свой враппер, в нём 2 поля. енум с типом мессаги и union из мессаг (возможно можно запихнуть в union - я не помню, надо перепроверить). на принимающей стороне парсишь это дело, смотришь на енум и исходя из значения парсишь нужной схемой
Во, это мне тоже пришло в голову. Но как бы google умные ребята и я решил, что за меня давно всё придумали.
на правах оффтопа - для разнообразия можешь посмотреть на flatbuffers. О нём по какой-то неведомой мне причине незаслуженно редко вспоминают
на правах оффтопа, пока еще есть возможность сменить протокол. Только он предоставляет что-то такое?
такое - емнип тоже нет. там такую же схему надо делать. но ты проверь в flatbuffers, как union себя ведёт. мне кажется, что там сразу кодируется инфа о типе, которую вытянуть можно
Спасибо большое, покумекаю!
Обсуждают сегодня