Мне интересно, существует ли общий c способ десериализации сообщения, содержащего под-сообщение oneof
. Сообщение oneof
будет содержать много других сообщений. Прямо сейчас я могу заставить его работать с помощью оператора switch
для номера case
и вызвать соответствующий метод получения. Но, если есть общий c способ, чтобы в будущем мне не приходилось добавлять новые случаи.
Я бы хотел исключить случаи и иметь что-то общее c, где я мог бы получить тип сообщения, т.е. Exit
, и вызвать правильный геттер. Есть ли способ сделать это с помощью отражения? Я искал примеры в Интернете, но ничего не нашел.
proto-файл:
message AllClientMessages {
oneof client_message {
util.client.command Exit exit = 1
util.client.command SendNew sendnew = 2
util.client.command CancelAll cancelAll = 3
// ... (more than 60 messages)
}
}
Код (buf
содержит сериализованный сообщение):
const std::unique_ptr<google::protobuf::Message> ProtoBuilder::deserialize(char* buf)
{
AllClientMessages clientMsg;
clientMsg.ParseFromString(buf);
switch(clientMsg.client_message_case())
{
case AllClientMessages::kExitFieldNumber: //generate enums
return make_unique<Exit>(clientMsg.exit());
case AllClientMessages::kSendNewFieldNumber:
return make_unique<SendNew>(clientMsg.sendnew());
// I access the getter and return unique_ptr to base protobuf Message.
// ... I do this for each case.
}
}