Как частично объединить повторяющееся поле в сообщение?

У меня есть два сообщения одного типа MyMSG, что мы будем называть A а также B:

message MyMSG {
repeated int msg_bucket = 1;
}

Я хочу скопировать один msg_bucket (только один, такие как A.msg_bucket(0)) в A в B, не MergeFrom но частично слить.

Какую функцию я должен использовать?

2

Решение

Как Марк Гравелл ♦ указал, что для этого нет автоматизма.

Самый простой способ было бы, просто добавить новый msg_bucket в контейнер, который вы хотите, чтобы он был «слит» в (B), затем присваивая соответствующее значение или копируя, если у вас есть сообщение вместо целого.

По-другому было бы, чтобы сериализовать B в контейнер, создавая новый MyMSG C, который содержит только те поля, которые вы хотите объединить, добавив сериализацию этого нового контейнера в сериализованный Bи, наконец, разбор B из сериализованных данных.

MyMSG A, B, C; //considered initialized as described above
std::vector<char> serializedContainer(500);
B.SerializeToArray(serializedContainer.data(), serializedContainer.size());
C.SerializeToArray(serializedContainer.data() + B.ByteSize(), serializedContainer.size() - B.ByteSize());
B.ParseFromArray(serializedContainer.data(), B.ByteSize() + C.ByteSize());
0

Другие решения

Для этого вам нужно создать отдельный MyMSG экземпляр, который имеет просто msg_bucket значения, которые вы хотите сериализовать, и сериализовать этот экземпляр. Ни одна из известных мне библиотек не имеет API, позволяющего указывать дискретные элементы из существующего списка для сериализации («только для индексов 0, 7 и 42, пожалуйста»).

0

По вопросам рекламы [email protected]