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

C++ 具有特定顶点类型的图的序列化,c++,serialization,boost,boost-graph,C++,Serialization,Boost,Boost Graph,我想对使用BGL存储的图形进行磁盘I/O。我正在使用boost::序列化 首先,一些编译代码: 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

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

首先,一些编译代码:

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;
}
不幸的是,这无法编译:编译器抱怨缺少序列化函数:

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
错误:“结构myVertex”没有名为“serialize”的成员

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


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

您应该声明参数为非常量:

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

你太强壮了!再次感谢。我想我添加了const(这甚至不在手册中!!!)一开始是因为我想到了“写作”,因此我通常的习惯是“到处都是最大限度地构造”让我添加了它。重点是我们仍然有一个问题,编译器没有给出足够的错误消息。。。我被这一点愚弄,认为“我需要重新定义图形是如何序列化的”,但事实并非如此。我希望编译人员能够改进。
template <class Archive> void serialize(Archive &ar, myVertex &mv, unsigned /*version*/) {
#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