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

C++ 序列化包含字符串的类,以便通过套接字通过网络发送它?,c++,serialization,winsock,stdstring,C++,Serialization,Winsock,Stdstring,我正在用winsock库做一点实验,创建一个非常简单的服务器-客户端连接。客户端应向服务器发送消息,服务器应将消息转发给所有客户端。每个客户端只应打印一条消息,如果它不是消息本身的发送者 为了在通过网络发送消息时识别消息并对其进行序列化/反序列化,我创建了一个消息类,其成员中有一个std::string 但是,我在序列化过程中遇到了问题 要序列化,我使用struct SerializedMessage: typedef struct { int iMessageID;

我正在用winsock库做一点实验,创建一个非常简单的服务器-客户端连接。客户端应向服务器发送消息,服务器应将消息转发给所有客户端。每个客户端只应打印一条消息,如果它不是消息本身的发送者

为了在通过网络发送消息时识别消息并对其进行序列化/反序列化,我创建了一个消息类,其成员中有一个std::string

但是,我在序列化过程中遇到了问题

要序列化,我使用struct 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     |  
|             |
+-------------+  
这种技术很好,因为你可以阻止阅读文本;您知道读取前的长度(这也有助于动态分配内存)

带有终止符(Sentinel)字符的文本 这是C样式字符串的定义

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

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

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

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

长度后跟文本 写下文本的长度。
写课文

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

带有终止符(Sentinel)字符的文本 这是C样式字符串的定义

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

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

注意-不要在
C++
中使用
typedef struct
,不需要它。只需使用
struct
。明白了。实际上,我来自C语言,在大学里,他们教我为了可读性,最好使用typedef定义结构。有什么理由不建议在cpp中使用?您不理解引用答案的哪一部分?“他们告诉我,为了可读性,最好使用typedefs定义结构”-它不是更可读。来自
C
的人更熟悉它。它不能提高可读性。你的大学教你错了,因为他们错误地熟悉简单性/可读性。无法区分这些是危险的。只需使用
struct
(或
class
)并忘记
typedef
不能单独使用S,必须在C++中使用StultS。code>您可以使用S directlynote-不要在
C++
中使用
typedef struct
,不需要它。只需使用
struct
。明白了。实际上,我来自C语言,在大学里,他们教我为了可读性,最好使用typedef定义结构。有什么理由不建议在cpp中使用?您不理解引用答案的哪一部分?“他们告诉我,为了可读性,最好使用typedefs定义结构”-它不是更可读。来自
C
的人更熟悉它。它不能提高可读性。你的大学教你错了,因为他们错误地熟悉简单性/可读性。无法区分这些是危险的。只需使用
struct
(或
class
)并忘记
typedef
不能单独使用S,必须在C++中使用StultS。代码>您可以直接使用S