在C++中序列化/反序列化简单协议的最佳方法

Best way of serializing/deserializing a simple protocol in C++

本文关键字:协议 最佳 方法 简单 反序列化 C++ 序列化      更新时间:2023-10-16

我想在Linux上使用Berkeley套接字C++构建一个简单的应用程序协议。传输层应该是UDP,协议将包含以下两部分:

第一部分:

它是一个固定部分,是具有以下字段的协议标头:

1. int HeaderType
2. int TransactionID
3. unsigned char Source[4]
4. unsigned char Destination[4]
5. int numberoftlvs

第二部分

它将包含可变数量的 TLV,每个 TLV 将包含以下字段:

1. int type
2. int length
3. unsigned char *data "Variable length"

我的问题是准备通过网络发送的消息,进行序列化和反序列化的最佳方法是什么,以便在小端和大端等所有系统上可移植?

我是否应该准备一个大的"无符号字符"缓冲区,并开始将字段一个接一个地复制到其中?之后,只需调用发送命令?

如果我要遵循前面的方法,我如何继续跟踪指向复制字段的指针,我的猜测是为每个数据类型构建一个函数,该函数将知道要移动指针多少字节,对吗?

如果有人能为我提供一个解释得很好的例子,将不胜感激。

一些想法...排名不分先后...而且可能没有意义

  • 你可以有一个缓冲区类。此类包含您撰写消息的原始内存指针,它可以包含计数器或指针来跟踪您写了多少、在哪里写以及你能走多远。
  • 您可能希望每个线程读取/写入都有一个 Buffer 类实例。没有更多,因为您不希望周围有像这样的昂贵缓冲区。绑定到特定线程,因为您不想在没有锁定的情况下共享它们(并且锁定很昂贵)
  • 您可能希望从一条消息
  • 重用缓冲区到下一条消息,从而避免创建和销毁它的成本。
  • 您可能想要探索装饰器的概念,该类继承或包含每个数据类。在这种情况下,他们的想法是这个装饰器包含序列化和反序列化每种数据类型的方法。
  • 一种选择是使装饰器成为模板,并使用类模板专用化来提供不同的格式。
  • 结合装饰器方法和缓冲区方法,您应该拥有所需的所有控件。
  • 您可以在 Buffer 类中使用神奇的模板化方法,这些方法将任意对象作为参数,并自动为其创建装饰器并进行序列化。
  • 相反,反序列化应该会给你一个装饰器,应该可以转换为装饰类型。

很抱歉,我现在没有时间给你一个完整的例子,但我希望上述想法能让你开始。

例如,

我无耻地插入了我自己的(反)序列化库,该库打包成msgpackv5格式:慌乱