如何使用协议缓冲区中的扩展来维护'general'消息

how to use extensions from protocol buffers to maintain 'general' message

本文关键字:维护 消息 general 扩展 协议 何使用 缓冲区      更新时间:2023-10-16

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

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

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

我想在过去,C#中的消息的定义与时尚相似,它们仍然在C++应用程序中定义(使用proto文件和protoc)。我可以使用相同的proto文件在C#中定义消息吗?怎样延期会被解释还是被推翻?

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

有很多方法可以做到这一点。我并不是实际上确定扩展是我想要的,但是:

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

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-net确实支持这一点,但正如博客中提到的,这不包括在当前的v2测试版中。它很快就会到,但我不得不在某个地方排队。它包含在通过下载的v1(r282)中

请注意,protobuf-net只是几个C#/.net实现中的一个。有线格式是相同的,但您可能还想考虑直接端口的版本。如果我必须总结一下区别,我会说"protobuf-net是一个.net串行器,恰好是protobuf;protobuf-csharp-port是一个protobuf串行器,正好是.net"-它们都达到了相同的目的,但protobuf-et侧重于与C#/.net惯用,其中端口更侧重于具有相同的API。当然,两者都应该在这里工作。