Sérialisation de structures complexes en C ++

J’essaie de sérialiser un ensemble de structures en C ++. Cela fonctionne très bien pour toutes les données sauf un vecteur contenu dans ma structure. Je peux écrire les données sur le disque, puis lire toutes les données en mémoire. Le seul problème est que lorsque j’essaie d’accéder à un élément du vecteur, je reçois une erreur de segmentation. Mon code est ci-dessous. Toute aide est grandement appréciée.

Programme pour écrire sur le disque

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

Programme pour lire depuis le disque

  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: " <FullName << endl; cout << "First Grade: " <grades[0] << endl; cout << "Second Grade: " <grades[1] << endl; ifs.close(); return 0; } 

Ce que vous faites consiste à copier une région de mémoire contiguë dans laquelle vous en avez stocké one et que vous avez écrite sur le disque. Cela fonctionnera bien pour les types de données simples (POD en C ++ jargan). Le problème des vecteurs est qu’un vecteur est un object complexe avec des pointeurs sur d’autres régions de la mémoire. Ces autres régions de mémoire n’existent pas lorsque vous en dé-sérialisez one en two où votre erreur de segmentation.

Malheureusement, il n’y a pas de raccourci, il faudra écrire un formulaire sur le code de sérialisation personnalisé pour que le travail soit effectué.

Comme certains l’ont déjà mentionné, Boost Serialization peut aider. Vous pouvez également déployer le vôtre.

La version la plus simple de la sérialisation d’un vecteur offrant une chance de travail est probablement la suivante:

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

La relire ressemble à quelque chose comme:

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

Notez que ceci n’est pas particulièrement efficace – en particulier, cela suppose (essentiellement) que les données seront stockées au format texte, ce qui est souvent assez lent et prend beaucoup de place (mais est facile à lire, à manipuler, etc., par l’extérieur. programmes, ce qui est souvent utile).