C++ 中的常用方法是提供可以将自定义类型序列化为“流”对象的函数,然后提供一种方法来获取指向流中累积的数据块开头的指针。
一个简单的例子是 std::ostringstream ,您可以使用它来将数据序列化为流,然后获取指向构造字符串的指针:
int i = 13;
std::string message = "Hi";
std::ostringstream stream;
stream << i << message;
cout << stream.str() << endl; // prints "13Hi";
您可以通过提供<< 和>> 运算符的适当重载来对您的Data 类型执行相同的操作,如下所示:
std::ostringstream &operator<<( std::ostringstream &stream, const Data &v ) {
return stream << v.length << v.message;
}
std::ostringstream &operator>>( std::ostringstream &stream, Data &v ) {
return stream >> v.length; >> v.message;
}
使用这些函数,您可以这样做:
Data myData = { 13, "Hello" };
std::ostringstream stream;
stream << myData;
const std::string serializedData = stream.str();
send( .., serializedData.c_str(), serializedData.size() + 1, .. );
关于接收大小,你可以将数据读入缓冲区,然后使用std::istringstream 对象再次提取数据:
const char receivedData[ 1024 ];
// fill receivedData array using recv()
std::string s = receivedData;
std::istringstream stream( s );
Data myData;
stream >> myData;
您可能需要稍微缓冲接收到的数据,直到从流中读取成功。