2017-06-30 7 views
1

ブーストを使用してArmadillo colvecオブジェクトをシリアライズ/デシリアライズしようとしています。 colvecは、いくつかの異なるサイズを持つ列ベクトルです。 2次元ベクトルの場合は2行、3dベクトルの場合は3行、コードでは他の特定のベクトルサイズも使用できます。Armadillo colvecをブーストで非直列化

デシリアライズ時にcolvecの行数が不明な場合、昇順でcolvec型のシリアライズを処理する方法がわかりません。

はシリアライズする例えば、私は次のようなものがあります - は

namespace boost 
{ 
    namespace serialization 
    { 
     template<class Archive> 
     void serialize(Archive& archive, colvec& vector, unsigned int) 
     { 
      for (int i=0; i<vector.size(); i++) 
      { 
       archive& vector[i]; 
      } 
     } 
    } 
} 

これは、任意の数の行とcolvecをシリアライズします。しかし、このコードを「逆シリアル化」中に実行すると、vectorはsize()== 0のcolvecになります。必要な行数は不明です。

これを処理するにはどうすればよいのだろうかと思っていました。

私は間違いの可能性があります。私はArmadilloとBoostの両方に新しいです。

+0

はい、申し訳ありませんが、colvecはマットのためのアルマジロのtypedefでありますクラス。私はこの例でstd :: vectorを使用していません... – user3079907

+0

colvecとは何ですか? ['arma :: Col'](https://stackoverflow.com/q/39890640/1460794)? – wally

+0

はい、Matから派生したColのtypedefです。 – user3079907

答えて

1

ロード/セーブを分割することをお勧めします。配列の場合、デシリアライズ時に読み取る必要があるコンポーネントの数を知るには、まずサイズを格納する必要があります。連続したメモリレイアウトでは、最適化されたメモリを使用してください。

boost::serialization::make_array(T*,size) 

機能を使用してください。あなたがサポートしたい場合は最後にXMLアーカイブあなたはブーストがのstd ::ベクトルをシリアライズ方法を確認するには

/usr/include/boost/serialization/vector.hpp 

で見ることができ

boost::serialization::make_nvp(char*, T) 
// or the BOOST_SERIALIZATION_NVP macro 

を使用し、コードが読みやすいです。

私は確かに近くなりますアルマジロが最適化されていないコード(私はメモリレイアウト等...について見当もつかない)を使用したことがない

template<class Archive> 
inline void save(Archive & ar,const colvec& v,const unsigned int) { 

    const size_t size = v.size(); 
    ar << BOOST_SERIALIZATION_NVP(size); 

    for(size_t i=0;i<size;++i) { 
     ar << boost::serialization::make_nvp("v_i",v[i]); 
    } 
} 

template<class Archive> 
inline void load(Archive & ar,colvec& v,const unsigned int) { 

    size_t size; 
    ar >> BOOST_SERIALIZATION_NVP(size); 

    v.resize(size); 

    for(size_t i=0;i<size;++i) { 
     ar >> boost::serialization::make_nvp("v_i",v[i]); 
    } 
} 

template<class Archive> 
inline void serialize(Archive & ar,colvec& v, 
         const unsigned int file_version) { 

boost::serialization::split_free(ar, v, file_version); 

} 
+0

もご覧ください。http://www.boost.org/doc/libs/1_64_0/libs/serialization/doc/serialization.html#constructors – sehe

+1

ありがとうございます。これは完璧であり、修正なしで動作します。私が考えることができる唯一の他の方法は、構造体にcolvecをラップすることでした。構造体 "colvec2d"と "colvec3d"などと呼ばれる別の構造体を持ち、それぞれに異なるシリアライズメソッドを作成します。しかし、これは醜く、多くのコード変更を伴うでしょう。あなたの素晴らしい答えに感謝します。 – user3079907

関連する問題