У меня есть два сообщения одного типа MyMSG
, что мы будем называть A
а также B
:
message MyMSG {
repeated int msg_bucket = 1;
}
Я хочу скопировать один msg_bucket
(только один, такие как A.msg_bucket(0)
) в A
в B
, не MergeFrom
но частично слить.
Какую функцию я должен использовать?
Как Марк Гравелл ♦ указал, что для этого нет автоматизма.
Самый простой способ было бы, просто добавить новый 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());
Для этого вам нужно создать отдельный MyMSG
экземпляр, который имеет просто msg_bucket
значения, которые вы хотите сериализовать, и сериализовать этот экземпляр. Ни одна из известных мне библиотек не имеет API, позволяющего указывать дискретные элементы из существующего списка для сериализации («только для индексов 0, 7 и 42, пожалуйста»).