我正在尝试使用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/