首页 > 解决方案 > 序列化包含字符串的类,通过套接字通过网络发送它?

问题描述

通过创建一个非常简单的服务器-客户端连接,我正在尝试使用 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;
}

我试过看这里,它应该回答我的问题,但我是初学者,我并不真正理解解决方案对我的建议。

非常感谢一些帮助。谢谢!

标签: c++serializationwinsockstdstring

解决方案


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

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

长度后跟文本

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

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

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

带有终结符(哨兵)字符的文本

这是 C-Style 字符串的定义。

这种方法的一个问题是您不知道长度,这使得分配内存更加乏味,您必须搜索直到找到终止符(通常是逐个字符)。

固定长度

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


推荐阅读