Сериализация и десериализация графа с циклами

0

Я пытаюсь сериализовать (сохранить) и десериализовать (перезагрузить) объект с помощью библиотеки 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, но я не совсем понял понятия. Заранее спасибо.

Теги:
serialization
boost

1 ответ

0

Вам необходимо реализовать функции сериализации. Если вы не хотите изменять заголовки библиотек, добавьте такие помощники:

#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.

} }

По умолчанию отслеживание объектов выполняется на всех объектах (де), сериализованных через указатели. Это гарантирует, что указатели с псевдонимом не получат (де) сериализацию дважды, а это означает, что вы можете (де) сериализовать циклические графики в порядке.

Видеть

  • 0
    Я попытался реализовать ваш код, и я получаю эту ошибку "34 IntelliSense: определение пространства имен не разрешено main.cpp 207" В чем может быть проблема ?? "
  • 0
    Либо вы разместили код в неправильном месте (внутри класса или функции? OO), либо вам просто нужно игнорировать IntelliSense и вместо этого следить за ошибками компилятора . Обратите внимание, что я составил такие вещи, как title() , source , target . Я прокомментирую их снова, чтобы прояснить.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню