Protocol buffers 在protobuf流中多路复用/解多路复用不同类型的消息

Protocol buffers 在protobuf流中多路复用/解多路复用不同类型的消息,protocol-buffers,Protocol Buffers,我想通过电线发送不同的protobuf消息流,并能够在它们到达时区分它们 假设我有一个*.proto这样: message Book { //... } message BlueRay{ //... } 然后在发送方,我序列化了这个序列(C#中的伪代码): 我如何才能知道我在接收方收到的消息的顺序/类型?(合同当然在发送方和接收方都有) 根据我的发件人的状态,我无法推测/说出要发送的内容和顺序 我知道没有像中所述的那样的内置方法,但例如,对于消息的大小,有一个helper(C#API help

我想通过电线发送不同的protobuf消息流,并能够在它们到达时区分它们

假设我有一个*.proto这样:

message Book {
//...
}
message BlueRay{
//...
}
然后在发送方,我序列化了这个序列(C#中的伪代码):

我如何才能知道我在接收方收到的消息的顺序/类型?(合同当然在发送方和接收方都有) 根据我的发件人的状态,我无法推测/说出要发送的内容和顺序

我知道没有像中所述的那样的内置方法,但例如,对于消息的大小,有一个helper(C#API helper WriteDelimited method to embedded size)

如何获取/映射收到消息的类型

我的服务器将使用给定的语言(实际上是C语言)编写,但我的客户机应该可以在任何protobuf支持的目标中“实现”,所以我不想设置一些序列化C/CLR特定内容的东西


我可能在用一种奇怪的方式使用protobuf?我正在尝试建立一种协议。

我想我终于找到了如何做到这一点(目前只在C#中)

基本上,我正在向流中写入以下内容:

  • 即将到来的消息描述符的目标名称(在proto文件中,因为两端都共享此定义),使用原语进行字符串序列化
  • 即将到来的消息大小,使用原语进行大小序列化
  • 将序列化消息导入流中
这将产生如下方法:

public static void WriteToStream(Stream outputStream, IMessage message)
{
    MessageDescriptor stateMsgDescriptor = message.Descriptor;

    using (CodedOutputStream codedOutStr = new CodedOutputStream(outputStream, true))
    {
        codedOutStr.WriteString(stateMsgDescriptor.FullName);

        int size = message.CalculateSize();
        codedOutStr.WriteLength(size);

        message.WriteTo(codedOutStr);

        codedOutStr.Flush();
    }
}
作为

协议缓冲线格式不是自定界的,因此协议 缓冲区解析器无法自行确定消息的结束位置

public static void WriteToStream(Stream outputStream, IMessage message)
{
    MessageDescriptor stateMsgDescriptor = message.Descriptor;

    using (CodedOutputStream codedOutStr = new CodedOutputStream(outputStream, true))
    {
        codedOutStr.WriteString(stateMsgDescriptor.FullName);

        int size = message.CalculateSize();
        codedOutStr.WriteLength(size);

        message.WriteTo(codedOutStr);

        codedOutStr.Flush();
    }
}