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