【问题标题】:Serialization of complex structures in C++C++中复杂结构的序列化
【发布时间】:2010-08-19 16:17:32
【问题描述】:

我正在尝试用 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;
 }

【问题讨论】:

  • 请附上Student的声明
  • 天哪!您正在混合 C 和 C++,malloc 以动态分配元素,同时在结构内将其与 std::vector 混合...您真的应该回到基础并从简单的 C++ 教程开始。实际上,您的程序很可能处于未定义行为领域...(提示:Student 结构中的std::vector 何时初始化?)
  • 天哪...您需要回顾一下序列化的概念以及 C 和 C++ 之间的区别。这个网站上有一些问题推荐阅读列表来学习C++,这对你有很大的好处。事实上,您的程序需要完全重写。

标签: c++ struct


【解决方案1】:

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

不幸的是,没有捷径,需要编写一些自定义序列化代码的表格才能完成工作。

正如一些人已经提到的那样,Boost Serialization 可能会有所帮助。或者推出自己的。

【讨论】:

    【解决方案2】:

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

    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];
    

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

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多