zoukankan      html  css  js  c++  java
  • 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文档.

    序列化串也可应用于数据库保存. 实际上可以保存任意的数据结构.
  • 相关阅读:
    c# 进程间同步实现
    mysql 中文支持
    堆排序算法详解
    CodeSmith 使用
    东软C#编程规范
    红伞各版key 申请和下载
    sql 添加删除字段
    第一个Hibernate 程序终于测试通过了
    C#下载大文件并实现断点续传
    Ms rdlc 打印
  • 原文地址:https://www.cnblogs.com/sohoer2003/p/2518245.html
Copyright © 2011-2022 走看看