用于了解发送的protobuf消息类型的API

时间:2010-07-12 17:54:22

标签: protobuf-net

用什么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?

1 个答案:

答案 0 :(得分:3)

protobuf(在任何实现中)只是序列化API。在线上交谈时,默认是两端已经同意数据是什么。对于发送不同类型的消息,有几个选项可供选择:

  1. 有一个包装器对象,它只包含表示不同消息类型的子对象。使用protobuf-net 具体你也可以直接将它映射到继承(因为protobuf-net将继承映射到封装)
  2. 使用邮件标题 - 您的邮件之前的某种数据标识此信息。特别是,如果使用Base128前缀样式,则可以包含随消息一起发送的字段编号(默认为1,但重载方法允许您指定此项)。然后,您可以通过Serializer.NonGeneric.TryDeserializeWithLengthPrefix对其进行反序列化,其中包含一个委托参数,以便从字段编号中执行类型解析。

  3. 编辑后......您提及sendIdsendName,但消息SendNameMessage始终将成为该消息中的所有内容(默认值除外)。它可能都是。它可能都不是。因此,在那个场景中,您只需反序列化它并检查.sendName.sendId

    另一个常见选项 here 是添加一个鉴别器,可能只是一个枚举:

    enum MesageType {
        Error = 0,
        Name = 1,
        Id = 2
    }
    

    并在消息中包含

    [ProtoMember(10)]
    public MessageType MessageType {get;set;}
    

    现在您有显式方式表达消息类型的 含义。