如何将列表序列化为字符数组

How to serialize a list into an array of chars

本文关键字:字符 数组 序列化 列表      更新时间:2023-10-16

我有一个定义为:的列表

list<Message*> g_messages;

其中Message为:

struct Message {
    static unsigned int s_last_id; 
    string user_name;
    string content;
    unsigned int id;
};

我的目标是使用Winsock(从服务器到客户端)发送这些信息,但这只允许发送WinSock2.h中出现的字符。考虑到这一点,我想将所有信息(idcontentuser_name)串行化到一个字符数组中,以便将其全部发送到一起,有一个反序列化的函数,以便拥有与我在服务器中相同的向量。

我该如何实现它?

感谢您的帮助。

您有几个选项,没有一个简单的解决方案。您必须设计自己的协议,服务器和客户端可以就套接字流的序列化和反序列化达成一致。

Message的一个特性使这一点变得有点棘手,那就是当它被展平为字符数组时,它会产生一个可变长度的数组,因为Message的字符串是可变长度的。因此,客户端将有一定量的解释,因为它不能假设字节0-2对应于X等等。

您可以采取的一种方法是将所有数据成员写入字符串流,每个数据成员由分隔符分隔,可能是空格:

std::ostringstream oss;
oss << s_last_id << " " << user_name << " " << content << " " << id;

然后在写入套接字时:

std::string messageString = oss.str();
std::vector<char> writable(begin(messageString), end(messageString));
char* c = &writable[0];
send(socket, c, writable.size(), 0);

在客户端,您可以将传入的字符数组解析为相应的数据成员:

char recvBuf[bufMax];
recv(socket, recvBuf, bufMax, 0);
std::istringstream iss(std::string(recv));
iss >> s_last_id >> user_name >> content >> id;

这可能不是最具性能的解决方案,但它非常简单,可能适合您的情况。