5

我正在尝试序列化本征矩阵。这样我就可以序列化一个更复杂的对象。我使用 Matrix 作为基类,并在派生类中包含序列化。我对如何处理 Matrix.data() 感到困惑,它返回一个 c 样式的数组(如果我是正确的)。这是我的尝试:

#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:
};

我想将它用作“包装器”:

VariableType<Matrix<double,3,1>> serializableVector;

代替

Matrix<double,3,1> vector;
4

2 回答 2

9

由于 Eigen 中的 Matrix 很密集,因此您可以将 Jakob 答案中的 for-loop 替换为make_array为:

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

我在这篇文章中做了更详细的回答:https ://stackoverflow.com/a/23407209/1686769

于 2012-12-26T08:46:09.020 回答
8

通过将以下自由函数放入您的编译单元,您可以有效地使 Boost.Serialization 了解如何序列化 Eigen 类型:

namespace boost
{
    template<class Archive, typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _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<t.size(); i++)
            ar & t.data()[i];
    }
}

在您给出的示例中,您应该能够做到(未经测试):

void serialize(Archive & ar, const unsigned int version)
{
    ar & *this;
}

查看我之前关于使用 Boost.Serialization 对 Eigen 类型进行序列化的回答以获得更详细的示例。

于 2012-10-17T06:59:46.890 回答