用C++编写复杂结构的序列化

Dan*_*Dan 7 c++ struct

我正在尝试用C++序列化一组结构.这适用于除我的struct中包含的向量之外的所有数据.我可以将数据写入磁盘,然后将所有数据读回内存.唯一的问题是当我尝试访问向量的元素时,我得到了一个分段错误.我的代码如下.任何帮助是极大的赞赏.

程序写入磁盘

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();
}
Run Code Online (Sandbox Code Playgroud)

程序从磁盘读取

 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;
 }
Run Code Online (Sandbox Code Playgroud)

dor*_*ron 7

你正在做的是复制你已经存储one并将其写入磁盘的连续内存区域.这适用于简单的数据类型(C++ jargan中的POD).向量的问题是向量是一个复杂的对象,其指针指向其他内存区域.内存这些其他地区是不存在的,当你反序列化onetwo,因此您的分段错误.

遗憾的是没有快捷方式,需要编写自定义序列化代码的某些表单才能完成工作.

正如一些人已经提到过Boost Serialization可能有所帮助.或者推出自己的.


Jer*_*fin 5

序列化一个有可能工作的向量的最简单版本可能是这样的:

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

读回来就像:

size_t size;
your_stream >> size;
vector_two.resize(size);
for (size_t i=0; i<size; i++)
    your_stream >> vector_two[i];
Run Code Online (Sandbox Code Playgroud)

请注意,这不是特别有效 - 特别是,它(基本上)假设数据将以文本格式存储,这通常相当慢并占用额外的空间(但很容易通过外部读取,操作等)程序,这通常是有用的).