我准备编写一个独立于平台的套接字协议。经过一些初步研究后,protobuf似乎还有很长的路要走。我是protobuf的新手,我似乎无法弄清楚一个具体的问题。
我的要求是:
完全独立于平台的客户端;
C#server;
异步消息通信;
从.proto
文件开始工作(所以没有现有类的推断);
必须能够在服务器/客户端不知道预期的消息类型的情况下发送消息。
我已经找到了(De)SerializeWithLengthPrefix
方法,它们是一个开始。 如果我事先不知道类型,我无法弄清楚如何收到消息。
我已经看到protobuf-net支持继承并且可以检测消息的类型,因此对于protobuf-net,继承来自公共基类型的所有消息都可以。 然而,这不是独立于平台的,我正在寻找一种独立于平台的方式。
所以我的问题是:我如何发送消息,以便任何客户端都可以在不知道预先输入类型的情况下对其进行反序列化?
答案 0 :(得分:2)
如果要求是使用不同类型的多条消息:
只需将唯一编号与每种不同类型的邮件相关联,并将其用作邮件的前缀;您可以使用可选的整数参数轻松地对重载的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如何处理继承,但很容易从其他客户端表示,并自动处理所有子消息的长度。