Как сериализовать разные protobufs в одном массиве данных и извлечь их позже? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть два протоса, как, скажем,

Сообщение1 и Сообщение2.

Я получу эти прото сообщения. Я хочу их сериализовать, но добавляю сериализованные байты в один байтовый массив. Как правильно это сделать?

Я имею в виду, что из результирующего байтового массива потребитель должен иметь возможность десериализовать два сообщения. Нужно ли добавлять какие-то метаданные типа

Message1 -> 1
Message2 -> 2

Затем, когда я добавляю байты, полученные для отдельных сериализованных сообщений (в данном случае Message1 и Message2), к чему-то

result = [1], [len bytearray для message1] [bytearray для message1], [2], [len bytearray для message2], [bytearray для message2]

, а затем отправьте байтовый массив. На стороне потребителя они будут читать первый байт в качестве типа сообщения, вторые 4 байта для длины сообщения и на основе этого чтения первого байта массива сообщений и т. Д.

Как насчет, если я хочу сериализовать их в JSON. Мне все еще нужно делать какую-то кодировку?

Также позволяет упростить вопрос. Если мне нужно добавить несколько экземпляров одного и того же сообщения в одном байтовом массиве, какой будет идеальный способ сделать это?

1 Ответ

0 голосов
/ 30 августа 2018

Вы правы, рассматривая какую-то схему, чтобы указать, какие байты в массиве принадлежат какому сообщению, и каков каждый тип сообщения. Сам Proforbuf Wireformat не имеет разграничения типа сообщения или длины.

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

message Message1
{
    ...
}

message Message2
{
    ...
}

message Message3
{
    oneof type
    {
        Message1 msg1 = 1;
        Message2 msg2 = 2;
    }
}

message Message4
{
    repeated Message3 messages = 1;
}

Предполагая, что отправка байтового массива сама по себе не нуждается в разграничении (т. Е. Вы не отправляете через сокет или другой поток байтов), вам ничего не нужно делать, кроме отправки только сообщений Message4.

...