c# – 独立于平台的protobuf套接字协议 – 我会收到什么消息?

我准备编写一个独立于平台的套接字协议.经过一些初步研究后,protobuf似乎还有很长的路要走.我是protobuf的新手,我似乎无法弄清楚一个具体的问题.

我的要求是:

>完全独立于平台的客户;
> C#服务器;
>异步消息通信;
>从.proto文件工作(因此不能从现有类推断);
>必须能够在服务器/客户端不知道预期的消息类型的情况下发送消息.

我已经找到了(De)SerializeWithLengthPrefix方法,它们是一个开始.我不知道的是如果我事先不知道类型,如何收到消息.

我已经看到protobuf-net支持继承并且可以检测消息的类型,因此对于protobuf-net,继承来自公共基类型的所有消息都可以.但是,这不是平台独立的,我正在寻找一种独立于平台的方法.

所以我的问题是:如何发送我的消息,以便任何客户端可以在不知道预先输入类型的情况下反序列化它们?

最佳答案 如果要求是使用不同类型的多条消息:

只需将唯一编号与每种不同类型的邮件相关联,并将其用作邮件的前缀;您可以使用可选的整数参数轻松地执行此操作以重载SerializeWithLengthPrefix方法.客户端必须预处理此前缀(或者可以通过Serializer.NonGeneric在protobuf-net中处理,它具有反序列化方法,该方法提供从此前缀号获取类型的回调).

如果要求是使用完全未知的数据:

鉴于你的要求,我怀疑Jon’s port会更合适;因为你的重点是平台独立性和.proto,而不是推理(protobuf-net擅长)或其他特定于.NET的扩展/实用程序.

请注意,虽然.proto可以(通过protoc)编译为常规protobuf流,但在接收器处使用完全外来数据是不规则的.它可以通过将所有内容视为扩展或使用编码流来完成,但是……

编辑以下评论中的讨论:

这里的简单模式可能很简单:

message BaseMessage {
    optional SomeMessage someMessage = 1;
    optional SomeOtherMessage someOtherMessage = 2;
    optional SomeThirdMessage someThirdMessage = 3;
}
message SomeMessage {...}
message SomeOtherMessage {...}
message SomeThirdMessage {...}

(如果有帮助,您可以选择添加鉴别器)

这实质上就是protobuf-net处理继承的方式,但很容易从其他客户端表示,并自动处理所有子消息的长度.

点赞