网游中需要在客户端和服务器之间传递多个字符串,
字符串的个数不定, 各个字符串的长度也不定.
对于长度变化不大的字符串, 可以用最大字符串长度:
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文档.
序列化串也可应用于数据库保存. 实际上可以保存任意的数据结构.
字符串的个数不定, 各个字符串的长度也不定.
对于长度变化不大的字符串, 可以用最大字符串长度:
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文档.
序列化串也可应用于数据库保存. 实际上可以保存任意的数据结构.