Я пытаюсь сериализовать (сохранить) и десериализовать (перезагрузить) объект с помощью библиотеки Boost, чтобы минимизировать потребности в служебной памяти, так как я создал несколько объектов. Я новичок в библиотеке Boost, но до сих пор я не хочу изменять библиотеки, которые я использую. Я попытался написать код ниже, но я получил ошибку {ошибка C2039: "serialize": не является членом "DirectedGraphicalModels :: CGraph'E:\external\boost\boost_1_54_0\boost\serialization\access.hpp 118}. Заголовок библиотеки Graph, которую я использую, здесь
int main(int argc, char *argv[])
{
CImageGraph *pGraph = new CGraph(nStates);
cout << "Building the Graph..." << endl;
pGraph->buildImageGraphN4(fv.rows, fv.cols, pEdgeTrainer != NULL, true);
// Save data
{
const char* fileName = "Graph.txt";
// Create an output archive
std::ofstream ofs(fileName);
boost::archive::text_oarchive ar(ofs);
// Save only the pointer. This will trigger serialization
// of the object it points too, i.e., o1.
ar & pGraph;
}
// Restore data
CImageGraph *pRGraph = new CGraph(nStates);
cout << "Building the Graph for restore..." << endl;
pRGraph->buildImageGraphN4(fv.rows, fv.cols, pEdgeTrainer != NULL, true);
pRGraph;
{
const char* fileName = "Graph.txt";
// Create and input archive
std::ifstream ifs(fileName);
boost::archive::text_iarchive ar(ifs);
// Load
ar & pRGraph;
}
// Make sure we read exactly what we saved.
assert(pRGraph != pRGraph);
//assert(*pRGraph == pRGraph);
}
Просьба посоветовать мне, как я могу идти вперед и сохранять и перезагружать график для дальнейшей обработки. До сих пор я упоминал об этом статьях 1 и 2, но я не совсем понял понятия. Заранее спасибо.
Вам необходимо реализовать функции сериализации. Если вы не хотите изменять заголовки библиотек, добавьте такие помощники:
#include <boost/serialization/vector.hpp>
namespace boost { namespace serialization {
template <typename Ar>
void serialize(Ar& ar, DirectGraphicalModels::CGraph& graph, const unsigned int version) {
//// e.g.:
// ar & graph.title();
// ar & graph.nodes(); // will use the default vector adaptation from the header above
// ar & graph.edges(); // will use the default vector adaptation from the header above
}
template <typename Ar>
void serialize(Ar& ar, DirectGraphicalModels::Node& node, const unsigned int version) {
//// e.g.:
// ar & node.source;
// ar & node.target;
}
// etc.
} }
По умолчанию отслеживание объектов выполняется на всех объектах (де), сериализованных через указатели. Это гарантирует, что указатели с псевдонимом не получат (де) сериализацию дважды, а это означает, что вы можете (де) сериализовать циклические графики в порядке.
Видеть
title()
,source
,target
. Я прокомментирую их снова, чтобы прояснить.