用什么API来了解正在发送的protobuf消息?
例如,我使用以下命令获取SendNameMessage对象。
SendNameMessage sendNameObj = Serializer.DeserializeWithLengthPrefix< SendNameMessage>(流, PrefixStyle.Fixed32);
听众如何知道正在发送什么类型的消息?
以下是我的SendNameMessage类:
[ProtoContract]
class SendNameMessage
{
[ProtoMember(1)]
public string sendName { get; set; }
[ProtoMember(2)]
public int sendId { get; set; }
}
如何知道发送的邮件是sendName还是sendId?
答案 0 :(得分:3)
protobuf(在任何实现中)只是序列化API。在线上交谈时,默认是两端已经同意数据是什么。对于发送不同类型的消息,有几个选项可供选择:
Base128
前缀样式,则可以包含随消息一起发送的字段编号(默认为1
,但重载方法允许您指定此项)。然后,您可以通过Serializer.NonGeneric.TryDeserializeWithLengthPrefix
对其进行反序列化,其中包含一个委托参数,以便从字段编号中执行类型解析。编辑后......您提及sendId
和sendName
,但消息为SendNameMessage
。 始终将成为该消息中的所有内容(默认值除外)。它可能都是。它可能都不是。因此,在那个场景中,您只需反序列化它并检查.sendName
和.sendId
。
另一个常见选项 here 是添加一个鉴别器,可能只是一个枚举:
enum MesageType {
Error = 0,
Name = 1,
Id = 2
}
并在消息中包含 :
[ProtoMember(10)]
public MessageType MessageType {get;set;}
现在您有显式方式表达消息类型的 含义。