使用 Boost 反序列化 Armadillo colvec

De-serialize Armadillo colvec with Boost

我正在尝试 serialize/deserialize 使用 Boost 的 Armadillo colvec 对象。 colvec 是具有几个不同大小的列向量,例如它可以有 2 行用于 2d 向量,3 行用于 3d 向量,我也在代码中使用其他特定的向量大小。

在反序列化过程中,当 colvec 中的行数未知时,我不确定如何处理 boost 中 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。但是,当此代码在 "de-serialization" 期间为 运行 时,向量将是 size()==0 的 colvec,例如所需的行数将是未知的。

我想知道处理这个问题的最佳方法是什么。

我的理解可能有误。我是 Armadillo 和 Boost 的新手。

我建议分开 load/save。对于数组,您还需要先存储大小,以便能够知道在反序列化时必须读取多少个组件。对于连续的内存布局,使用优化的

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

函数。最后如果你想支持 XML 存档使用

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

你可以看看

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

看Boost如何序列化std::vector,代码通俗易懂

我从未使用过 Armadillo 但是未优化的代码(我对内存布局等一无所知...)肯定会接近于:

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);

}