具有特定顶点类型的图的序列化
Serialization of a graph with specific vertex type
我想对使用 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’
我对此的理解是,内部 BGL 数据结构提供了一个序列化函数,它本身依赖于顶点(显然还有边)的 class 成员序列化函数。而且它不能使用外部序列化函数。
请注意,如果我使用所谓的 "intrusive" 方式(将序列化函数添加为 class 成员),它 确实 构建良好,但我想知道是否可以按照上面的解释完成。
您应该将参数声明为非常量:
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
我想对使用 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’
我对此的理解是,内部 BGL 数据结构提供了一个序列化函数,它本身依赖于顶点(显然还有边)的 class 成员序列化函数。而且它不能使用外部序列化函数。
请注意,如果我使用所谓的 "intrusive" 方式(将序列化函数添加为 class 成员),它 确实 构建良好,但我想知道是否可以按照上面的解释完成。
您应该将参数声明为非常量:
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