c++ - 具有特定顶点类型的图的序列化

标签 c++ serialization boost boost-graph

我想对使用 BGL 存储的图形进行磁盘 I/O。我正在使用 boost::serialization。

首先,一些可以编译的代码:

typedef boost::adjacency_list<
    boost::vecS
    ,boost::vecS
    ,boost::undirectedS
    > graph_t;

int main()
{
    graph_t g;

    std::ifstream ifs( "file_in" );          // read from file
    boost::archive::text_iarchive ia( ifs );
    ia >> g;    

    std::ofstream ofs( "file_out" );        // save to file
    boost::archive::text_oarchive oa( ofs );
    oa << g;
}

现在,我需要将数据存储到我的顶点中。所以我重新定义了我的图表:

struct myVertex
{
    int a;
    float b;
};

typedef boost::adjacency_list<
    boost::vecS,
    boost::vecS,
    boost::undirectedS,
    myVertex
    > graph_t;

当然,我需要定义如何序列化myVertex。由于我不想混淆该数据结构,因此我想使用非侵入式方式,因为它是 described in the manual .

因此,按照手册中的说明,我添加了所需的功能:

namespace boost {
namespace serialization {

    template<class Archive>
    void serialize( Archive& ar, const myVertex& mv, const unsigned int version )
    {
        ar & mv.a;
        ar & mv.b;
    }

} // namespace serialization
} // namespace boost

不幸的是,这无法编译:编译器提示缺少序列化函数:

error: ‘struct myVertex’ has no member named ‘serialize’

Live code on Coliru

我对此的理解是,内部 BGL 数据结构提供了一个序列化函数,该函数本身依赖于顶点(显然还有边)的类成员序列化函数。并且它不能使用外部序列化函数。

请注意,如果我使用所谓的“侵入式”方式(将序列化函数添加为类成员),它确实构建得很好,但我想知道是否可以按照上面的解释来完成.

最佳答案

您应该将参数声明为非 const:

template <class Archive> void serialize(Archive &ar, myVertex &mv, unsigned /*version*/) {

现场演示

Live On Coliru

#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/graph/adj_list_serialize.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <fstream>

struct myVertex {
    int a;
    float b;
};

namespace boost {
    namespace serialization {
        template <class Archive> void serialize(Archive &ar, myVertex &mv, unsigned /*version*/) {
            ar & mv.a & mv.b;
        }
    } // namespace serialization
} // namespace boost

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, myVertex> graph_t;

#include <iostream>
int main(int argc, char**) {

    if (argc>1) {
        graph_t g;
        std::ifstream ifs("file_out"); // read from file
        boost::archive::text_iarchive ia(ifs);
        ia >> g;

        std::cout << "Read " << num_vertices(g) << " vertices\n";
    }

    {
        graph_t g(100);
        std::ofstream ofs("file_out"); // save to file
        boost::archive::text_oarchive oa(ofs);
        oa << g;
    }
}

打印:

./a.out
./a.out read_as_well
Read 100 vertices

关于c++ - 具有特定顶点类型的图的序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48444571/

相关文章:

c++ - 重载 'ref(Select::Expressions::Code&)' 的调用在 C++11 中不明确

c++ - clockTick 函数未在此范围内声明

java - 不使用注释的 Jackson 多态反序列化

c++ - 使用 boost::this_thread::sleep_for() 和常规 sleep() 函数有什么区别?

c++ - Boost 连接后从 TCP 服务器访问 TCP 客户端 IP 地址 + 端口

c++ - 重新定义为另一种符号

c++ - STL 容器中的 max_size 由什么决定?

perl - 如何在 Perl 中序列化闭包?

java - 序列化 Collat​​or 实例

c++ - boost::asio io_service 线程池