我正在对 winsock 库进行一些试验,方法是创建一个非常简单的服务器-客户端连接。客户端应向服务器发送消息,服务器应将消息转发给所有客户端。如果每个客户端不是消息的发送者本身,则它应该只打印一条消息。
为了在通过网络发送消息时识别消息并对其进行序列化/反序列化,我创建了一个 Message 类,它的成员中有一个 std::string。
但是,我在序列化过程中遇到了问题。
为了序列化,我使用了一个结构 SerializedMessage:
typedef struct {
int iMessageID;
std::string strText;
} SerializedMessage;
然后我想创建一个新的 SerializedMessage* 指针,将数据存储在其中并通过套接字发送。 虽然我可以使用 htonl() 函数轻松保存 ID,但我不知道如何处理字符串。
到目前为止,这是我的序列化方法:
void* Message::Serialize()
{
SerializedMessage* pSerializedMessage = new SerializedMessage();
pSerializedMessage->iMessageID = htonl(m_iMessageID);
//copying the text?
return (void*)pSerializedMessage;
}
我试过寻找 here它应该可以回答我的问题,但我是初学者,我并不真正理解解决方案向我提出的建议。
非常感谢您的帮助。谢谢!
最佳答案
问题的根本原因是文本字符串是可变长度的记录。
序列化字符串有三种流行的方法:1) 长度后跟文本,2) 带有终止符的文本和 3) 固定长度(可能有填充)。
长度后跟文本
写出文字的长度。
写正文。
+-------------+
| Text Length |
+-------------+
| |
| Text |
| |
+-------------+
这种技术很好,因为您可以阻止阅读文本;您知道阅读前的长度(这也有助于动态分配内存)。
带有终止符(哨兵)的文本
这是 C 风格字符串的定义。
此方法的一个问题是您不知道长度,这使得分配内存变得更加乏味,并且您必须搜索直到找到终止符(通常是逐个字符)。
固定长度
使用足以容纳最大文本长度的 block 大小,例如 4096。这在很多数据库中都很流行。这是性能/空间的权衡。该 block 加载(读取)速度很快,因为它是固定大小的。它可能会浪费空间,因为可能有空间未被文本占用。
关于c++ - 序列化一个包含字符串的类,以通过套接字通过网络发送它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56825159/