【问题标题】:multiplexing/demultiplexing different messages types in a protobuf stream在 protobuf 流中复用/解复用不同的消息类型
【发布时间】:2019-10-17 21:57:55
【问题描述】:

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

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

message Book {
//...
}
message BlueRay{
//...
}

然后和发送方,我序列化让我们说这个序列(C#中的伪代码):

Book1.WriteDelimitedTo(myStream);
BlueRay1.WriteDelimitedTo(myStream);
Book2.WriteDelimitedTo(myStream);

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

我知道没有像the documentation 中所述的内置方法,但例如对于消息的大小,有一个帮助器(C# API 帮助器 WriteDelimited 方法来嵌入大小)。

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

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

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

【问题讨论】:

    标签: protocol-buffers


    【解决方案1】:

    我想我终于找到了如何做到这一点(目前仅在 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();
        }
    }
    

    作为stated here

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-01
      • 2013-11-02
      • 1970-01-01
      • 2023-02-07
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      相关资源
      最近更新 更多