我正在尝试使用Boost对Armadillo colvec对象进行序列化/反序列化。 colvec是具有几个不同大小的列 vector ,例如对于2d vector ,它可以有2行,对于3d vector ,它可以有3行,而且我还在代码中使用其他特定的 vector 大小。

我不确定在反序列化期间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。但是,当此代码在“反序列化”期间运行时, vector 将是size()== 0的colvec。所需的行数将是未知的。

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

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

最佳答案

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

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

}

关于c++ - 使用Boost解串Armadillo colvec,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44854044/

10-11 17:04