2010-08-19 11 views
7

Ich versuche, eine Reihe von Strukturen in C++ zu serialisieren. Dies funktioniert hervorragend für alle Daten außer einem Vektor, der in meiner Struktur enthalten ist. Ich kann die Daten auf die Festplatte schreiben und dann alle Daten in den Speicher zurücklesen. Das einzige Problem ist, wenn ich versuche, auf ein Element des Vektors zuzugreifen, bekomme ich einen Segmentierungsfehler. Mein Code ist unten. Jede Hilfe wird sehr geschätzt.Serialisierung von komplexen Strukturen in C++

Programm auf die Festplatte

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(); 
} 

Programm zu schreiben, von der Festplatte

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

+0

Boost Serialisierung: http://www.boost.org/doc/libs/1_44_0/libs/serialization/doc/index. html – karlphillip

+0

Bitte geben Sie die Deklaration für 'Student' an –

Antwort

7

Was Sie tun, nimmt das Kopieren eines zusammenhängenden Speicherbereich, in dem Sie one gespeichert haben zu lesen und schrieb es auf Scheibe. Dies funktioniert gut für einfache Datentypen (POD in C++ jargan). Das Problem mit Vektoren ist, dass ein Vektor ein komplexes Objekt mit Zeigern zu anderen Speicherbereichen ist. Diese anderen Speicherbereiche sind nicht vorhanden, wenn Sie one in two demerialisieren, daher Ihr Segmentierungsfehler.

Leider gibt es keine Verknüpfung, einige Form auf benutzerdefinierten Serialisierungscode muss geschrieben werden, um die Arbeit zu erledigen.

Da einige schon erwähnt haben Boost Serialization kann helfen. Alternativ können Sie auch selbst ausrollen.

5

Wahrscheinlich die einfachste Version eines Vektors von Serialisierung, die eine Chance Arbeits steht, ist so etwas wie:

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

es Lesen geht so etwas wie:

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

Beachten Sie, dass dies nicht besonders effizient - Insbesondere wird davon ausgegangen, dass die Daten im Textformat gespeichert werden, das oft ziemlich langsam ist und zusätzlichen Platz einnimmt (aber durch externe Programme leicht zu lesen, zu manipulieren usw. ist, was oft nützlich ist). .