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