如何使用协议缓冲区的扩展来维护“通用”消息

2024-03-24

我的客户端-服务器通信如下所示:有一些所谓的公告,它们是用于交换信息的单独消息。这个想法是公告是每条消息的共同部分。实际上我想这将是消息的类型。类型决定内容是什么。在 UML 类图中,Annoucement 是所有其他消息继承的类。

我想在两个应用程序之间的通信中实现这个想法,一个是用 C++ 编写的,另一个是用 C# 编写的。我想我可以编写一条消息,其中包含一个类型为 if the message (an enum field) 的字段。所有与该类型相关的附加信息都将作为扩展来实现。

我找到了一些如何在 C++ 中使用扩展的示例,但是我不知道如何在 C# 中使用扩展。我知道有 IExtensible 和 IExtension 接口(在 protobuf-net 中),但我如何使用它们?互联网资源在这方面似乎很匮乏。

我想过去 C# 中的消息定义类似于时尚,它们仍然在 C++ 应用程序中定义(使用 proto 文件和 protoc)。我可以使用相同的 proto 文件在 C# 中定义消息吗?如何?扩展会被解释还是覆盖?

如果我可以实现扩展,我会发送一条消息,解析它,检查类型并使用适当的函数来维护它。这对我来说听起来很酷,因为我不必关心我要读取的消息的类型 - 在解析之前我不必知道类型。


有多种方法可以做到这一点。我不是actually肯定是我想要的扩展,但是:

在您的消息类型中,您可以为每个子消息设置一组完全定义的字段,即

base-message
  {1-5} common fields
  {optional 20} sub-message 1
  {optional 21} sub-message 2
  {optional 22} sub-message 3
  {optional 23} sub-message 4
sub-message 1
  {1-n} specific fields

其中您将恰好拥有子消息对象之一

或者,封装更具体消息中的公共部分:

common field type
  {1-n} fields
sub-message 1
  {1} common field type
  {2-m} specific fields

任何一种方法都允许您反序列化; IMO,第二个更棘手,因为它要求您提前知道类型。唯一方便的方法是为每个前缀添加不同的标识符。我个人更喜欢第一个。然而,这并不需要扩展——因为我们提前知道一切。碰巧,第一个也是 protobuf-net 如何实现继承,因此您可以通过类型继承(抽象基本消息类型的 4 个具体子类型)来实现这一点[ProtoInclude(...)]

重新扩展数据; protobuf网络does不过支持这一点正如博客中提到的 http://marcgravell.blogspot.com/2011/05/protobuf-net-v2-beta.html这不包含在当前的 v2 beta 中。很快就会到了,但我必须在某个地方放一条线。它包含在 v1 (r282) 下载中

请注意,protobuf-net 只是几个 C#/.NET 实现之一。有线格式是相同的,但您可能还需要考虑直接移植版本 http://code.google.com/p/protobuf-csharp-port/。如果我必须总结差异,我会说“protobuf-net 是一个 .NET 序列化器,恰好是 protobuf;protobuf-csharp-port 是一个 protobuf 序列化器,恰好是 .NET”——它们都达到了相同的目的,但是protobuf-net 侧重于 C#/.NET 的惯用性,而该端口更侧重于拥有相同的 API。当然,两者都应该在这里工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用协议缓冲区的扩展来维护“通用”消息 的相关文章

随机推荐