Как использовать Boost: сериализация для сохранения Eigen:: Matrix

Здравствуйте, у меня есть код, который реализует libeigen2 для вычисления собственных векторов. Теперь я хочу использовать boost:: serialization для сохранения информации для последующего получения. Из примера tutorial Я придумал следующий код!

class RandomNode {
private:
friend class boost::serialization::access;
template<class archive="">
void serialize(Archive & ar, const unsigned int version)
{
 ar & is_leaf_;
 ar & depth_;
 ar & num_classes_;
 ar & num_features_;
 // Split node members
 ar & random_feature_indices_;
 ar & random_feature_weights_;
 ar & threshold_;
 ar & leftChild_;
 ar & rightChild_;
 }
bool is_leaf_;
int depth_;
int num_classes_;
int num_features_;
// Split node members
VectorXi random_feature_indices_;
VectorXd random_feature_weights_;
****** threshold_;
RandomNode* leftChild_;
RandomNode* rightChild_;
 // Methods and so on
}
</class>

Теперь, когда я пытаюсь запустить этот код, я получаю следующую ошибку

/usr/include/boost/serialization/access.hpp:118:9: error: ‘class Eigen::Matrix<******, 1="" 10000,="">’ has no member named ‘serialize’
</******,>

Как я могу сериализовать класс Eigen:: Matrix? Является ли это возможным? Спасибо заранее.

1 ответ

Вы должны прочитать документацию boost:: serialization по теме serializable. В основном это говорит о том, что типы должны быть примитивными или Serializable. Тип Eigen - это ничто, что ваш компилятор пытается вам рассказать. Чтобы сделать сериализуемые типы Eigen, вам потребуется реализовать следующую свободную функцию

template<class archive="">
inline void serialize(
 Archive & ar, 
 my_class & t, 
 const unsigned int file_version
) {
 ...
}
</class>

Чтобы сделать это для Eigen, я думаю, вы могли бы сделать что-то вроде этого   шаблон

Вот пример реализации, который должен работать для вас:

#include <fstream>
#include <eigen core="">
#include <boost archive="" text_oarchive.hpp="">
using namespace Eigen;
struct RandomNode {
friend class boost::serialization::access;
template<class archive="">
void serialize(Archive & ar, const unsigned int version)
{
 ar & random_feature_indices_;
 ar & random_feature_weights_;
}
// Split node members
VectorXi random_feature_indices_;
VectorXd random_feature_weights_;
};
namespace boost
{
template<class archive,="" typename="" _scalar,="" int="" _rows,="" _cols,="" _options,="" _maxrows,="" _maxcols="">
inline void serialize(
 Archive & ar, 
 Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> & t, 
 const unsigned int file_version
) 
{
 size_t rows = t.rows(), cols = t.cols();
 ar & rows;
 ar & cols;
 if( rows * cols != t.size() )
 t.resize( rows, cols );
 for(size_t i=0; i</class></class></boost></eigen></fstream>

licensed under cc by-sa 3.0 with attribution.