2010-08-19 39 views
7

我試圖序列化一組C++中的結構體。這適用於除了包含在我的結構中的矢量之外的所有數據。我可以將數據寫入磁盤,然後將所有數據讀回內存。唯一的問題是,當我嘗試訪問vector的一個元素時,我得到了分段錯誤。我的代碼如下。任何幫助是極大的讚賞。在C++中對複雜結構進行序列化

程序寫入到磁盤

int main { 
    struct Student one; 
    strcpy(one.FullName, "Ernestine Waller"); 
    strcpy(one.CompleteAddress, "824 Larson Drv, Silver Spring, MD 20910"); 
    one.Gender = 'F'; 
    one.LivesInASingleParentHome = true; 
    one.grades.push_back(80); 
    one.grades.push_back(90); 

    ofstream ofs("fifthgrade.ros", ios::binary); 
    ofs.write((char *)&one, sizeof(one)); 
    ofs.close(); 
} 

計劃從磁盤中讀取

int main { 
    struct Student *two = (struct Student *) malloc(sizeof(struct Student));  
    ifstream ifs("fifthgrade.ros", ios::binary); 
    //cout << "Size of struct: " << size << endl; 
    ifs.read((char *)two, sizeof(struct Student)); 
    cout << "Student Name: " << two->FullName << endl; 
    cout << "First Grade: " << two->grades[0] << endl; 
    cout << "Second Grade: " << two->grades[1] << endl; 
    ifs.close(); 
    return 0; 
} 
+0

http://www.parashift.com/c++-faq-lite/serialization.html – DumbCoder 2010-08-19 16:20:29

+0

Boost序列化:http://www.boost.org/doc/libs/1_44_0/libs/serialization/doc/index。 html – karlphillip 2010-08-19 16:23:39

+0

請包括'學生'聲明 – 2010-08-19 16:24:18

回答

7

你在做什麼正在複製一個連續的內存區域已在其中存儲one並寫信給磁盤。這對於簡單數據類型(C++ jargan中的POD)可以很好地工作。矢量的問題在於矢量是一個複雜的對象,指向其他內存區域。當您將one反序列化爲two時,這些其他區域的內存不存在,因此您的分段錯誤。

不幸的是,沒有捷徑,需要編寫一些自定義序列化代碼的表單來完成工作。

正如有些人已經提到Boost Serialization可能有所幫助。或者推出自己的。

5

或許序列化站工作的機會,一個向量的最簡單的版本是這樣的:

your_stream << your_vector.size(); 
std::copy(your_vector.begin(), your_vector.end(), 
    std::ostream_iterator<your_vector::value_type>(your_stream, "\n")); 

讀回雲一樣的東西:

size_t size; 
your_stream >> size; 
vector_two.resize(size); 
for (size_t i=0; i<size; i++) 
    your_stream >> vector_two[i]; 

注意,這不是特別有效 - 特別是,它(基本上)假設數據將以文本格式存儲,這通常相當緩慢並佔用額外的空間(但易於被外部程序讀取,操作等,這通常是有用的) 。