• 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文档.

    序列化串也可应用于数据库保存. 实际上可以保存任意的数据结构.
  • 相关阅读:
    05-3. 六度空间 (PAT)
    05-2. Saving James Bond
    05-1. List Components (PAT)
    04-3. Huffman Codes (PAT)
    04-2. File Transfer (PAT)
    04-1. Root of AVL Tree (PAT)
    03-3. Tree Traversals Again (PAT)
    03-2. List Leaves (PAT)
    03-1. 二分法求多项式单根(PAT)
    CDH Namenode自动切换(active-standby)
  • 原文地址:https://www.cnblogs.com/sohoer2003/p/2518245.html
Copyright © 2020-2023  润新知