2013-04-21 55 views
0

我已经有相当一段时间了,现在试图找到一个很好的方法来通过tcp套接字来序列化或发送一个状态对象。我的问题是,我无法使用任何3.派对库如boost。通过套接字发送一个带有矢量的C++对象

我的状态对象包含多个对象。最重要的是它获得了一些对象和一个对象向量,但没有指针(例如,如果向量不需要这个,可能没有深度复制)。

我的问题:因为我不能使用boost或任何其他库,通过套接字发送对象的最佳方式是什么? 我一直在想,我可能会制作一个拷贝构造函数并将它发送给一个流,但我不确定这样做的后果。

+0

你需要使用的工具称为(反)序列。尝试搜索,你会发现很多有用的答案(如在这里:http://stackoverflow.com/questions/234724/is-it-possible-to-serialize-and-deserialize-a-class-in-c ) – 2013-04-21 10:09:41

+0

是的,我需要序列化的对象,但我不能使用像你提到的链接像升压像库。但在这我想知道如何序列化对象的最佳方式,而不使用所述的库:) – larhauga 2013-04-21 10:45:21

回答

1

为您的数据类型定义(解除)序列化函数。

举例来说,如果你有这样的:

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; 
} 
+0

这听起来像一个计划,但我有一些问题,你的代码。什么是'int fd'? 你说我可以将arg转换为字节数组或字段。我在写函数时会做到这一点,以便我可以在阅读时解析它。有没有一种好的方法可以将它输出为像ostream一样? – larhauga 2013-04-21 10:37:48

+0

fd是一个文件描述符,用于访问套接字连接。 – Etherealone 2013-04-21 11:00:38

+0

@larhauga很简单。套接字传输字节。所以你让你的对象看起来像是一个字节序列并返回 – 2013-04-21 13:05:39