【问题标题】:How to Boost::serialize a hashmap of vectors?如何 Boost::serialize 向量的哈希图?
【发布时间】:2017-07-24 05:38:18
【问题描述】:

我有一个核心数据结构,我正在将值加载到其中:它是一个向量的哈希图。但是,向量包含一个结构。此外,该结构使用模板类型。

我需要序列化这个数据结构并定期保存到磁盘。然后,稍后——在不同的程序中——我需要加载序列化的数据结构。

这是结构的简化版本。我对它们进行了最低限度的定义,但除了这个基本版本之外,还有其他数据项(成员)。

#include<vector>
#include<string>
#include<map>
#include<fstream>
#include<stdlib.h>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/map.hpp>
#include <boost/archive/text_oarchive.hpp>
using namespace std;

template<typename T>
struct DataUnit{
    size_t time;
    string transaction_string;
    T transaction;             
}

template<typename T>
struct DataStructure{
    map<string transaction_hash, vector<DataUnit<T>> > hashmap;
    int max_transactions;

    // I have a method to add stuff, but omitted for readability
} 

我从第一个结构 DataUnit 开始,并对其进行了如下修改:

    template<typename T>
struct DataUnit{
    size_t time;
    string transaction_string;
    T transaction;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version){
        ar & time;
        ar & transaction;
        ar & transaction_string;
    }
};

最后,我需要序列化数据结构。但是,当我使用以下代码运行它时:

int main(){
    DataUnit<int> hi;
    hi.time = time(NULL);
    hi.transaction = 1;
    hi.transaction_string = "world";
    return 0;
}

世界因 boost 的错误而崩溃。据我所知,我遵循了教程示例exactly。如何增强序列化这些对象?

一些错误(但有这么多我不敢相信这不是根本问题......):

在函数`boost::archive::text_oarchive::text_oarchive(std::ostream&, unsigned int)中

对`boost::archive::text_oarchive_impl::text_oarchive_impl(std::ostream&, unsigned int)'的未定义引用

最后一个错误:

对`boost::archive::archive_exception::~archive_exception()'的未定义引用

它从那里继续...但我看不出我缺少任何包含...(boost 是通过 Cygwin 安装的)...

(以管理员身份运行代码...我输出的文本文件存在,具有读写权限...ofs对象创建成功)...


目前,完全没有想法......(尝试链接 lboost_serialization,重新安装 boost)不知道我是否从代码中遗漏了什么 ^^^

【问题讨论】:

  • 我认为您需要链接到 boosts 库之一。这看起来像链接器错误。
  • @KurtStutsman 谢谢你。我试过 -lboost_serialization;但我无法弄清楚还有什么可以尝试的。您知道我可以去哪里寻找可能的联系的清单/文档吗?
  • 你用来构建的命令是什么?能否将整个命令行添加到问题中?
  • @KurtStutsman 是的,今天下午
  • @KurnStutsman 所以当我注释掉所有提升时,这编译一切正常;取消注释提升,一切都会中断:g++ -std=c++11 -lboost_serialization main.cpp hashmap_transaction.h hashmap_transaction.cpp -o run.exe 这是在 Cygwin 中;尝试-lboost-serialization以防万一,它找不到链接...

标签: c++ serialization boost


【解决方案1】:

问题是您对构建命令的依赖顺序。您需要在使用它们的模块之后列出依赖项。你也不编译 .h 文件。它们应该包含在使用它们的 .cpp 文件中。试试这个命令:

g++ -std=c++11 main.cpp hashmap_transaction.cpp -o run.exe  -lboost_serialization

【讨论】:

  • 好的,将尝试...目前,重新安装 boost 并从 tar 构建而不是 Cygwin 安装...
  • @bordeo 重新安装 boost 和/或从源代码构建不会有帮助。现在可能只是中止构建以节省时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2020-05-19
  • 2011-02-04
  • 1970-01-01
相关资源
最近更新 更多