2012-10-12 8 views
5

Sto provando a serializzare la matrice di Eigen. In modo che io possa serializzare un oggetto più complesso. Sto usando Matrix come classe base e includo la serializzazione nella classe derivata. Sono confuso su come affrontare Matrix.data(), che restituisce un array in stile c (se sono corretto). Questo è il mio tentativo:serializzazione di Eigen's Matrix con boost.serialization

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

vorrei usarlo come un "wrapper":

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

al posto di

Matrix<double,3,1> vector; 
+0

per la serializzazione, ho usato http://www.boost.org/doc/libs/1_51_0/libs/serialization/doc/index.html –

risposta

8

Inserendo la seguente funzione libera nella vostra unità di compilazione, puoi effettivamente rendere Boost.Serialization consapevole di come serializzare i tipi 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]; 
    } 
} 

Nell'esempio hai dato, si dovrebbe quindi essere in grado di fare (non testato):

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

Dai un'occhiata alla mia previous answer sulla serializzazione di tipi di Eigen utilizzando Boost.Serialization per un esempio più dettagliato.

+1

Non avrebbe senso scrivere la serializzazione per 'Eigen :: DenseBase'? Penso che in questo modo si possa anche serializzare 'Eigen :: Array' con lo stesso codice, si veda: http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html –