gpt4 book ai didi

protobuf-net - 了解正在发送的 protobuf 消息类型的 API

转载 作者:行者123 更新时间:2023-12-04 04:06:03 28 4
gpt4 key购买 nike

知道正在发送的 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?

最佳答案

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

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

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

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

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

并在消息中包含那个:

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

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

关于protobuf-net - 了解正在发送的 protobuf 消息类型的 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3230841/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com