c++ - 序列化一个包含字符串的类,以通过套接字通过网络发送它?

标签 c++ serialization winsock stdstring

我正在对 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/

相关文章:

c++ - 在嵌套类中使用模板值

ruby-on-rails - Rails 5,sqlite3 使用数组作为列/属性问题

java - 将 POJO 序列化为 json,并将某些值作为字符串或列表

windows - 确定现有连接是否在 Windows 下使用 TCP KeepAlive

c# - C++ 指针与 C# 指针

C++ 模板帮助,使用模板进行集成

c++ - 如何让 CMake 基于 GCC 版本通过 std=c++14/c++1y 或 c++17/c++1z?

java - 在java中序列化数组列表

tcp - 为什么 Windows7 上的 TCP/IP 需要 500 次发送才能预热? (w10,w8 证明没有受到影响)

c - 如何在 C 中防止 WinSock 上的空输入