我已经有相当一段时间了,现在试图找到一个很好的方法来通过tcp套接字来序列化或发送一个状态对象。我的问题是,我无法使用任何3.派对库如boost。通过套接字发送一个带有矢量的C++对象
我的状态对象包含多个对象。最重要的是它获得了一些对象和一个对象向量,但没有指针(例如,如果向量不需要这个,可能没有深度复制)。
我的问题:因为我不能使用boost或任何其他库,通过套接字发送对象的最佳方式是什么? 我一直在想,我可能会制作一个拷贝构造函数并将它发送给一个流,但我不确定这样做的后果。
我已经有相当一段时间了,现在试图找到一个很好的方法来通过tcp套接字来序列化或发送一个状态对象。我的问题是,我无法使用任何3.派对库如boost。通过套接字发送一个带有矢量的C++对象
我的状态对象包含多个对象。最重要的是它获得了一些对象和一个对象向量,但没有指针(例如,如果向量不需要这个,可能没有深度复制)。
我的问题:因为我不能使用boost或任何其他库,通过套接字发送对象的最佳方式是什么? 我一直在想,我可能会制作一个拷贝构造函数并将它发送给一个流,但我不确定这样做的后果。
为您的数据类型定义(解除)序列化函数。
举例来说,如果你有这样的:
class MyClass
{
public:
int field_a;
int field_b;
std::string string;
...
};
typedef std::vector<MyClass> MyVector;
您可以定义如下:
void write(int fd, const MyClass &arg)
{
// either convert arg to byte array and write it, or write field by field
// here we write it field by field
write_int(fd, arg.field_a);
write_int(fd, arg.field_b);
write_string(fd, arg.string);
}
void write(int fd const MyVector &arg)
{
size_t size = arg.size();
::write(fd, &size, sizeof(size)); // beware: machine-dependent code
for (MyVector::const_iterator it = arg.begin(); it != arg.end(); it++)
{
write(*it);
}
}
辅助功能:
void write_int(int fd, int arg)
{
write(fd, &arg, sizeof(int));
}
void write_string(int fd, const std::string &str)
{
size_t len = str.length();
write(fd, &len, sizeof(len)); // string length go first
write(fd, str.data(), len); // write string data
}
和阅读:
MyClass readMC(int fd)
{
// read MyClass data from stream, parse it
int f1, f2;
std::string str;
read_int(fd, f1);
read_int(fd, f2);
read_string(fd, str)
return MyClass(f1, f2, str);
}
void read(int fd, MyVector &arg)
{
size_t size;
size_t i;
read(fd, &size, sizeof(size)); // read number of elements;
arg.reserve(size);
for (i = 0; i < size; i++)
{
arg.push_back(readMC(fd));
}
}
个
辅助功能:
void read_int(int fd, int &res);
{
read(fd, &res, sizeof(res));
}
void read_string(int fd, std::string &string)
{
size_t len;
char *buf;
read(fd, &len, sizeof(len));
buf = new char[len];
read(fd, buf, len);
string.asssign(buf, len);
delete []buf;
}
这听起来像一个计划,但我有一些问题,你的代码。什么是'int fd'? 你说我可以将arg转换为字节数组或字段。我在写函数时会做到这一点,以便我可以在阅读时解析它。有没有一种好的方法可以将它输出为像ostream一样? – larhauga 2013-04-21 10:37:48
fd是一个文件描述符,用于访问套接字连接。 – Etherealone 2013-04-21 11:00:38
@larhauga很简单。套接字传输字节。所以你让你的对象看起来像是一个字节序列并返回 – 2013-04-21 13:05:39
你需要使用的工具称为(反)序列。尝试搜索,你会发现很多有用的答案(如在这里:http://stackoverflow.com/questions/234724/is-it-possible-to-serialize-and-deserialize-a-class-in-c ) – 2013-04-21 10:09:41
是的,我需要序列化的对象,但我不能使用像你提到的链接像升压像库。但在这我想知道如何序列化对象的最佳方式,而不使用所述的库:) – larhauga 2013-04-21 10:45:21