Boost Serialization在網(wǎng)游中的應(yīng)用實(shí)例
(轉(zhuǎn)載請注明來源于金慶的專欄)
網(wǎng)游中需要在客戶端和服務(wù)器之間傳遞多個字符串,
字符串的個數(shù)不定, 各個字符串的長度也不定.
對于長度變化不大的字符串, 可以用最大字符串長度:
struct MyCmd : public Cmd
{
WORD wNumber;
BYTE aStrings[MAX_SIZE][0];
};
這樣會浪費(fèi)一點(diǎn)帶寬.
如果不這樣, 可以用一個長的數(shù)據(jù)串, 在數(shù)據(jù)頭部指出字符串的長度,
或者直接用'\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();
還原時(shí):
std::vector<std::string> vNewStrings;
istringstream iss(sSerialized);
boost::archive::test_iarchive ia(iss);
ia & vNewStrings;
如果是不同的std容器, 只需包含不同的serialization頭文件.
如果未包含相應(yīng)的serialization頭文件, 編譯會報(bào)serialize()函數(shù)未定義錯誤.
如果是自定義的數(shù)據(jù)結(jié)構(gòu), 只需定義serialize()即可, 詳見boost文檔.
序列化串也可應(yīng)用于數(shù)據(jù)庫保存. 實(shí)際上可以保存任意的數(shù)據(jù)結(jié)構(gòu).
(轉(zhuǎn)載請注明來源于金慶的專欄)
網(wǎng)游中需要在客戶端和服務(wù)器之間傳遞多個字符串,
字符串的個數(shù)不定, 各個字符串的長度也不定.
對于長度變化不大的字符串, 可以用最大字符串長度:
struct MyCmd : public Cmd
{
WORD wNumber;
BYTE aStrings[MAX_SIZE][0];
};
這樣會浪費(fèi)一點(diǎn)帶寬.
如果不這樣, 可以用一個長的數(shù)據(jù)串, 在數(shù)據(jù)頭部指出字符串的長度,
或者直接用'\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();
還原時(shí):
std::vector<std::string> vNewStrings;
istringstream iss(sSerialized);
boost::archive::test_iarchive ia(iss);
ia & vNewStrings;
如果是不同的std容器, 只需包含不同的serialization頭文件.
如果未包含相應(yīng)的serialization頭文件, 編譯會報(bào)serialize()函數(shù)未定義錯誤.
如果是自定義的數(shù)據(jù)結(jié)構(gòu), 只需定義serialize()即可, 詳見boost文檔.
序列化串也可應(yīng)用于數(shù)據(jù)庫保存. 實(shí)際上可以保存任意的數(shù)據(jù)結(jié)構(gòu).