只要用到网络开发啊,就一定会用到序列化反序列化。
1,自定义结构体
struct test
{
int len;
int type;
char data[10];
}
test* data=(test*) buffer.
缺点:明文,只支持基本类型,不支持变长结构
2,在1的基础上,自定义一个缓冲类,存放一个消息。把消息写入缓冲,通过支持string, vector, map, userdata等,来实现各种结构体格式。
inline BytesBuffer& operator<<(BytesBuffer& buffer, const std::basic_string<wchar_t>& obj)
{
uint16_t dwLen = (uint16_t)obj.size();
assert(dwLen < 1024);
buffer << dwLen;
if(dwLen < 1024)
{
for(size_t i = 0; i < dwLen; ++i)
{
buffer << obj[i];
}
}
return buffer;
}
缺点:明文,每自定义一个结构体,都要定义一套读写机制。
3,用google buffer. 定义一个结构体,就可以自动生成对应的序列化反序列化类,而且使用起来方便,逻辑清楚。
有时间的话,自己可以把2的自动反射方面强化下,还有考虑点加密,实现个简易版的google buffer.
4,用了序列化类后,代码里还是需要定义结构体,这样的话,有些结构体和序列化类就重复定义了,怎么避免??
一种方法是用原始的1方案,用基础类型的结构体,char数组,而不用变长的string,通过强转来取得消息。