使用boost的archive做可变长度的网络消息数据打包
目的
在结构体上面可以定义std::string这样的数据,并方便打包与解包
核心
1. boost库提供了非常方便的对像序列化库boost::archive、boost::serialization,通过这两个库我们可以很方便的打包std里面像std::string、std::list这些类型的数据。
2. 打包数据我们当然要使用二进制的方式所以使用boost::archive::binary_iarchive、boost::archive::binary_oarchive。
3. 在真正编写代码的过程中发现这两个类为了序列化出来的数据有版本的区分还在输出的数据最前面加上一些版本信息,为了去除它们,最终我的解决方案是重写这两个类,将输出版本信息这块代码给关闭掉。
4. boost的序列化方法是在结构体上面做一个函数(全局的不提了),如下:
struct data
{
std::string v;
int v2;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & v;
ar & v2;
}
};
程序员总有一个通病“懒”,看到这样的代码就在想能不能将serialize函数给去掉或者让计算机自动生成,分析了很多,最后的解决方法是使用宏来处理在代码里可以看到MSG1、MSG2…MSG9这样的宏,它们就是为了完成这个想法而做的东西,很丑!!!(哪位有好的解决方法请一定要告知我,非常感谢)
5. 为了做到使用更加方便,简单做了MsgPack与MsgUnpack类来做打包与解包工作。
代码