金庆的专栏

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  423 随笔 :: 0 文章 :: 454 评论 :: 0 Trackbacks
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文档.

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

 
posted on 2009-09-21 13:32 金庆 阅读(2278) 评论(5)  编辑 收藏 引用 所属分类: 1. C/C++2. 网游开发

评论

# re: Boost Serialization在网游中的应用实例 2009-09-21 16:33 teli_eurydice
Boost Serialization 在DEBUG下不能读取内容,不知道兄弟碰到过没有 ,据说是析构引起的  回复  更多评论
  

# re: Boost Serialization在网游中的应用实例 2009-09-21 17:33 金庆
@teli_eurydice
没碰到过,给个示例看看?  回复  更多评论
  

# re: Boost Serialization在网游中的应用实例 2009-09-22 14:24 乐蜂网
开始就大方家  回复  更多评论
  

# re: Boost Serialization在网游中的应用实例 2010-07-27 03:27 yisa
为什么还在讨论为String和一些常见的结构体,类,容器做流化呢
这个已经不是游戏开发中的繁琐问题了
个人觉得:
能把服务器之间, 服务器和客户端之间的指针(这些指针是双方约定的)做流化, 更能解放开发人员, 提高开发效率, 减少bug, 代码上也更加安全.
此外, 把收发包来做自动流化, 反流化到自动调用消息函数, 更有意义;
比如:服务器
MessageInvoker<CellUnitEntity>::Invoke<MsgDst::CLIENT, MessageReceiver::ALL_CLIENT, ClientUnitFunc::OnMeleeAttack>
(_UnitEntity(), AttackController().GetTarget(), uiHitTime);
这个大概是: 服务器的对象在打人, 需要告诉客户端, AttackController().GetTarget()是一个指针(对应客户端有约定), 这样客户端的一个函数原型:
void OnMeleeAttack(ClientGameUnit* pkVictim, const FvUInt32 uiHitTime);会被调用, 中间不再有人需要写压包解包调用的代码
这样对游戏开发和其他的RPC应用显然有更大的意义  回复  更多评论
  

# re: Boost Serialization在网游中的应用实例 2010-07-27 14:10 金庆
@yisa
这里的指针应该是对象的ID号吧?RPC中就是对象的引用。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理