序列化包含字符串的类,以便通过套接字通过网络发送它?

时间:2019-06-30 13:21:30

标签: c++ serialization winsock stdstring

我正在通过创建一个非常简单的服务器-客户端连接来对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,它应该可以回答我的问题,但是我是一个初学者,我不太了解解决方案对我的建议。

非常感谢您的帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

此问题的根本原因是文本字符串是可变长度的记录。

有三种流行的字符串序列化方法:1)长度后跟文本,2)带有终止符的文本,以及3)固定长度(可能带有填充)。

长度后跟文字

写出文字的长度。
写文字。

+-------------+  
| Text Length |  
+-------------+  
|             |
|    Text     |  
|             |
+-------------+  

这种技术很好,因为您可以阻止阅读文本;您知道读取前的长度(这也有助于动态分配内存)。

带有终止​​符(前哨字符)的文本

这是C样式字符串的定义。

此方法的一个问题是,您不知道使内存分配更加繁琐的长度,因此必须进行搜索,直到找到终止符(通常逐个字符)。

固定长度

使用足够大的块大小来容纳最大的文本长度,例如4096。这在许多数据库中都很流行。这是性能/空间的权衡。该块的大小固定,因此可以快速加载(读取)。可能会浪费空间,因为可能存在文本未占用的空间。