c++ - 序列化包含字符串的类,通过套接字通过网络发送它?
问题描述
通过创建一个非常简单的服务器-客户端连接,我正在尝试使用 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;
}
我试过看这里,它应该回答我的问题,但我是初学者,我并不真正理解解决方案对我的建议。
非常感谢一些帮助。谢谢!
解决方案
问题的根本原因是文本字符串是可变长度记录。
序列化字符串有三种流行的方法:1)长度后跟文本,2)带有终止符的文本和 3)固定长度(可能带有填充)。
长度后跟文本
写出正文的长度。
写下文字。
+-------------+
| Text Length |
+-------------+
| |
| Text |
| |
+-------------+
这种技术很好,因为您可以阻止阅读文本;你知道阅读前的长度(这也有助于动态分配内存)。
带有终结符(哨兵)字符的文本
这是 C-Style 字符串的定义。
这种方法的一个问题是您不知道长度,这使得分配内存更加乏味,您必须搜索直到找到终止符(通常是逐个字符)。
固定长度
使用足够大的块大小以容纳最大的文本长度,例如 4096。这在很多数据库中都很流行。这是性能/空间的权衡。该块的加载(读取)速度很快,因为它是固定大小的。它可能会浪费空间,因为可能有空间没有被文本占用。
推荐阅读
- java - 如何对列表进行排序
获取Android后的数据 - java - 在 SpringBoot 中使用 LocalDateTime 时在本地和远程获取不同的时间戳(纪元时间)
- c# - 将购买许可证升级为 iap 购买
- flutter - 在 Cupertino 选项卡之间切换时如何重置导航器
- automata - NFA 到 DFA 的转换混淆?
- javascript - 如何在一个全新的空白页面中呈现 React Route 组件
- dialogflow-es - dialogflow api 中缺少 401 个未经授权的身份验证参数
- java - 如何将具有给定索引的新元素添加到链接列表中?
- excel - Excel公式:左和函数右
- python - 在 python 中进行网页抓取以获取知识