我准备编写一个独立于平台的套接字协议.经过一些初步研究后,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处理继承的方式,但很容易从其他客户端表示,并自动处理所有子消息的长度.