2013-04-21 54 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