Сериализация Eigen Matrix с использованием boost.serialization

Я пытаюсь сериализовать Eigen-матрицу. Так что я могу сериализовать более сложный объект. Я использую Matrix в качестве базового класса и включаю сериализацию в производном классе. Я смущен тем, как обращаться к Matrix.data(), который возвращает массив c-style (если я прав). Это моя попытка:

#include <boost archive="" text_oarchive.hpp="">
#include <boost archive="" text_iarchive.hpp="">
template < class TEigenMatrix>
class VariableType : public TEigenMatrix {
private:
 friend class boost::serialization::access;
 template<class archive="">
 void serialize(Archive & ar, const unsigned int version)
 {
 ar & this.data();
 }
public:
};
</class></boost></boost>

Я хотел бы использовать его как "обертку":

VariableType<matrix<******,3,1>> serializableVector;
</matrix<******,3,1>

вместо

Matrix<******,3,1> vector;
</******,3,1>
2 ответа

Поместив в свою компиляцию следующую свободную функцию, вы эффективно сделаете Boost.Serialization осведомленным о том, как сериализовать типы Eigen:

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
 ) 
 {
 for(size_t i=0; i</class>
<p>В приведенном примере вы должны быть способны (непроверены):</p> <pre class="prettyprint linenums">void serialize(Archive &amp; ar, const unsigned int version) { ar &amp; *this; }</pre> <p>Посмотрите на мой <a href="https://qa-help.ru/questions/kak-ispolzovat-boost-serializacziya-dlya-sokhraneniya-eigen-matrix" target="_blank">предыдущий ответ</a> на сериализацию типов Eigen, используя Boost.Serialization для более подробного примера.</p>


Поскольку матрица в Eigen плотна, вы можете заменить for-loop в ответе Якоба make_array как:

ar и boost:: serialization:: make_array (t.data(), t.size());

Я сделал более подробный ответ в этом сообщении: qaru.site/questions/952287/...

licensed under cc by-sa 3.0 with attribution.