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

时间:2014-04-02 16:30:01

标签: c++ linux sockets serialization deserialization

我想在Linux上使用C ++中的Berkeley套接字构建一个简单的应用程序协议。传输层应为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"

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

我应该准备一个“unsigned char”的大缓冲区,并开始逐个复制字段吗?之后,只需调用send命令?

如果我要按照前面的方式,我怎么能继续跟踪指向复制字段的位置的指针,我的猜测是为每个数据类型构建一个函数,该函数将知道移动指针的字节数,正确?

如果有人可以向我提供一个解释良好的例子,那将非常感激。

2 个答案:

答案 0 :(得分:1)

一些想法......没有特别的顺序......并且可能没有合理意义

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

对不起,我现在没有时间给你一个完整的例子,但我希望上面的想法能让你开始。

答案 1 :(得分:1)

作为一个例子,我无耻地插入我自己的(de)序列化库,它包装成msgpackv5格式: flurry