如何使用协议缓冲区中的扩展来维护'general'消息
how to use extensions from protocol buffers to maintain 'general' message
我的客户端-服务器通信看起来是这样的:有一些所谓的公告,它们是用于交换信息的单独消息。其理念是公告是每条信息的共同部分。事实上,我想这将是消息的类型。类型决定内容是什么。在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。当然,两者都应该在这里工作。
- boost::进程间消息队列引发错误
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何维护资源管理器项目视图中当前可见的项目列表
- 如何通过参数抛出错误消息
- 维护unordered_map但同时每一步都需要最低的映射值
- 从服务器传输到客户端的消息不会出现
- ROS2 动态消息模板
- C++秘密消息学校作业
- glad 导致 glfwSwapBuffers 返回错误消息
- C++入门 5 版:类消息和文件夹
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- 如何使用协议缓冲区中的扩展来维护'general'消息