如何在单个数据数组中序列化不同的protobuf,并在以后提取它们?

时间:2018-08-28 07:21:09

标签: json serialization encoding protocol-buffers proto

我有两个原型,比如说

Message1和Message2。

我将收到这些原始消息。我想序列化它们,但是将序列化的字节附加到一个字节数组中。正确的方法是什么?

我的意思是,从生成的字节数组中,使用者应该能够反序列化这两个消息。我是否需要添加某种元数据,例如

Message1 -> 1
Message2 -> 2

然后,当我将为单个序列化消息(在这种情况下为Message1和Message2)获得的字节附加到某物上

result = [1],[消息1的字节数组的len] [消息1的字节数组],[2],[消息2的字节数组的len],[消息2的字节数组]

,然后发送字节数组。在用户端,他们将读取第一个字节作为消息类型,然后读取第二四个字节以获取消息长度,并根据读取的内容读取第一个消息字节数组,依此类推。

如果我想将它们序列化为json呢。我还需要做某种编码吗?

也可以简化问题。如果我必须在单个字节数组中添加同一条消息的多个实例,那么理想的处理方式是什么?

1 个答案:

答案 0 :(得分:2)

您应该考虑采用某种方案来指示数组中的哪个字节属于哪个消息,以及每种消息的类型。 Protobuf Wireformat本身没有消息类型或长度划分。

但是,只有一种选择。如果您有第三个消息是前两个消息的oneof,而第四个消息是第三个消息的数组,那么您要做的就是填充第四个消息类型。

message Message1
{
    ...
}

message Message2
{
    ...
}

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

message Message4
{
    repeated Message3 messages = 1;
}

假设字节数组的发送本身并不需要标定(即,您不是通过套接字或其他字节流发送的),那么您只需要发送Message4即可。