【问题标题】:boost serialization of graph property map增强图形属性映射的序列化
【发布时间】:2017-03-10 17:43:11
【问题描述】:

我正在尝试使用以下定义序列化 boost::graph:

 typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS, boost::no_property,
                                  boost::property<boost::edge_weight_t, float> > mygraph_t;
    typedef boost::property_map<mygraph_t, boost::edge_weight_t>::type WeightMap;
    typedef mygraph_t::vertex_descriptor vertex;
    typedef mygraph_t::edge_descriptor edge_descriptor;


mygraph_t topoGraph;
WeightMap weightMap;

问题是由我尝试序列化“weightMap”引起的

即使我包含了我认为是适当的头文件,它也会失败并显示以下错误消息: "boost/graph/adj_list_serialize.hpp"

/usr/include/boost/serialization/access.hpp:118:9: error: ‘struct boost::adj_list_edge_property_map<boost::undirected_tag, float, float&, long unsigned int, boost::property<boost::edge_weight_t, float>, boost::edge_weight_t>’ has no member named ‘serialize’
         t.serialize(ar, file_version);
         ^

非常感谢您的帮助。

【问题讨论】:

  • 为了给您的问题一些价值,请发布相关代码 sn-p 以显示您如何进行序列化。

标签: c++ dictionary serialization boost graph


【解决方案1】:

我无法复制它

这是一个有效的在线版本

Live On Coliru

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/adj_list_serialize.hpp>

typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS, boost::no_property,
                                          boost::property<boost::edge_weight_t, float> > mygraph_t;
typedef boost::property_map<mygraph_t, boost::edge_weight_t>::type WeightMap;
typedef mygraph_t::vertex_descriptor vertex;
typedef mygraph_t::edge_descriptor edge_descriptor;

#include <boost/archive/text_oarchive.hpp>
#include <iostream>

int main() {
    mygraph_t topoGraph;
    WeightMap weightMap;

    boost::archive::text_oarchive oa(std::cout);
    oa << topoGraph;
}

希望它能帮助您发现不同之处。如果不是,您可能对特定(旧)版本的 Boost 有问题。

【讨论】:

    【解决方案2】:

    我认为您错过了包含以下文件:

    #include <boost/graph/adj_list_serialize.hpp>
    

    此头文件包含在非侵入模式下加载/保存 adjacency_list<...> 对象所需的序列化方法。

    【讨论】:

      【解决方案3】:

      为了序列化任何类的对象,该类必须提供一个 serialize() 模板函数。显然 adj_list_edge_property_map 类型没有该功能。解决这个问题的一种方法是创建一个包装类 W 来存储该类型的对象,并添加 W::serialize() ,它是通过序列化 weightMap 的组件来实现的。然后序列化 W,而不是序列化 weightMap。

      【讨论】:

      • 我认为您没有使用过 Boost 序列化。您无需更改类型即可使它们可序列化
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      相关资源
      最近更新 更多