3

知道正在发送哪种 protobuf 消息的 API 是什么?

例如,我使用以下内容获取 SendNameMessage 对象。

SendNameMessage sendNameObj = Serializer.DeserializeWithLengthPrefix<SendNameMessage>(stream, PrefixStyle.Fixed32);

听众如何知道正在发送什么样的消息?

以下是我的 SendNameMessage 类:

[ProtoContract]
class SendNameMessage
{
    [ProtoMember(1)]
    public string sendName { get; set; }

    [ProtoMember(2)]
    public int sendId { get; set; }
}

我如何知道正在发送的消息是 sendName 还是 sendId?

4

1 回答 1

3

protobuf(在任何实现下)只是序列化 API。在线通话时,默认情况是两端已经同意数据是什么。对于发送不同类型的消息,有几个选项会出现:

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

编辑后...您提到sendIdand sendName,但消息SendNameMessage. 它始终是该消息中的所有内容(默认值除外)。可能两者兼而有之。两者都不是。所以在那种情况下,你只需反序列化它并检查.sendName.sendId.

这里的另一个常见选项是添加一个鉴别器,也许只是一个枚举:

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

并将其包含消息中:

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

现在您有了一种明确的方式来表达对消息类型的含义。

于 2010-07-12T22:18:17.177 回答