Как изменить сериализованный массив байтов protobuf на месте? - PullRequest
0 голосов
/ 17 мая 2019

Рассмотрим сообщение protobuf:

message DataMessage {
    int32 custId = 1;
    string uuid = 2;
    int32 version = 3;
    string firmName = 4;
    google.protobuf.Timestamp date = 5;
    int32 accountNo = 6;
    string firmName = 7;
    bytes payload = 8;
} 

Я заполняю это и маршалю его в байтовый массив и публикую это как сообщение Кафки.Все это прекрасно работает.

Теперь к вопросу: обработчик Kafka получает байтовый массив.Я хотел бы изменить поля 2 и 3 ONLY без необходимости демонтажа массива байтов обратно в DataMessage, изменить поля 2 и 3, а затем перенаправить его обратно в другой массив байтов, чтобы он мог быть Кафкойопубликовано до следующего прыжка.Поле 3 является строкой, но это GUID в формате ISO.Модификация здесь не будет увеличивать или уменьшать длину поля.

protob.Buffer, кажется, не облегчает это.Кажется, он позволяет кодировать / декодировать по одному полю за раз.

Полезная нагрузка (поле 8) имеет размер 99% и не будет изменяться.Я хотел бы пропустить все временные копии и маршал / демаршал, чтобы изменить 1%.

Возможно?Я думаю, если бы я знал смещения в байтовом массиве для полей 2 и 3, я мог бы использовать модификацию байтов на месте ... однако это до некоторой степени подрывает целостность маршалированных байтов.Это можно упростить, используя fixed32 вместо int32 ... так что смещения в байтовом массиве согласованы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...