как поставить несколько протобуфов на провод - PullRequest
0 голосов
/ 26 марта 2020

У нас есть канал связи, по которому мы отправляем protobufs. Чтобы иметь возможность отправлять несколько типов протобуфов, мы дважды сериализуем:

message Coprolite {
    enum Bezoar {
        KBezoarUndef = 0;
        KBezoarFriedEggs = 1;
        KBezoarHam = 2;
    }
    Bezoar payload_type = 1;
    bytes payload = 2;
}

Если у меня есть FriedEggs протобуф, я сериализую его, назначаю его полезной нагрузке Coprolite, установите для payload_type значение KBezoarFriedEggs, сериализуйте Coprolite и отправьте его в путь.

При получении я десериализирую, проверяю то, что у меня есть, и десериализую это.

Это работает на всех наших платформ. Я, однако, не нашел примеров того, как другие так поступали (да и вообще никак). Так что это говорит о том, что я должен спросить совета. Есть ли лучшая стратегия или причина, по которой я должен опасаться этого?

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Если вы хотите предотвратить установку payload_type, вы можете использовать oneof. Один из них неявно сериализует тип полезной нагрузки, добавляя номер тега впереди. Так же, как любое другое сериализованное поле. Таким образом, вы должны писать меньше административного кода.

Однако у вашего подхода есть одно преимущество перед использованием одного из них. Зависит от вашего языка программирования и от того, как один или несколько байтовых массивов реализованы на вашей платформе и в вашей библиотеке protobuf. Один из них, реализованный как объединение, может выделять памяти размер самого большого вложенного сообщения. Таким образом, в зависимости от вашей ситуации динамическое выделение массива байтов может занять меньше памяти при отправке большого количества маленьких сообщений и только иногда большого.

1 голос
/ 26 марта 2020

Здесь есть два общих подхода; самый простой (особенно когда типы предсказуемы заранее) обычно oneof:

message Coprolite {
    oneof payload_type {
         FriedEggs eggs = 1;
         Ham ham = 2;
    }
}

Это действует как дискриминационное объединение, где вы можете проверить встроенный тип.

В некоторых нишевых сценариях ios вы можете использовать Any

...