С ++ protobuf oneof десериализация в общем - PullRequest
0 голосов
/ 04 августа 2020

Мне интересно, существует ли общий 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.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...