Boost Serialization在网游中的应用实例

Boost Serialization在网游中的应用实例

(转载请注明来源于金庆的专栏)

网游中需要在客户端和服务器之间传递多个字符串,
字符串的个数不定, 各个字符串的长度也不定.

对于长度变化不大的字符串, 可以用最大字符串长度:

struct MyCmd : public Cmd
{
    WORD wNumber;
    BYTE aStrings[MAX_SIZE][0];
};


这样会浪费一点带宽.

如果不这样, 可以用一个长的数据串, 在数据头部指出字符串的长度,
或者直接用'/0'分隔多个字符串, 如:

struct MyCmd : public Cmd
{
    DWORD dwDataLen;
    BYTE data[0];
};


这样需要拼接和解析处理.

如果用序列化串, 可以很方便的解决该问题.

struct MyCmd : public Cmd
{
    DWORD dwStrLen;
    BYTE aSerializedStr[0];
};

利用boost::serialization可以序列化任意的std容器.

例如:

#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/vector.hpp>
...
    std::vector<std::string> vStrings;
    ...
    ostringstring oss;
    boost::archive::text_oarchive oa(oss);
    oa & vStrings;
    std::string sSerialized = oss.str();

还原时:

    std::vector<std::string> vNewStrings;
    istringstream iss(sSerialized);
    boost::archive::test_iarchive ia(iss);
    ia & vNewStrings;

   
如果是不同的std容器, 只需包含不同的serialization头文件.
如果未包含相应的serialization头文件, 编译会报serialize()函数未定义错误.
如果是自定义的数据结构, 只需定义serialize()即可, 详见boost文档.

序列化串也可应用于数据库保存. 实际上可以保存任意的数据结构.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值