gpt4 book ai didi

c++ - 使用 Boost 反序列化 Armadillo colvec

转载 作者:行者123 更新时间:2023-11-30 05:11:51 24 4
gpt4 key购买 nike

我正在尝试使用 Boost 序列化/反序列化 Armadillo colvec 对象。 colvec 是具有几个不同大小的列 vector ,例如它可以有 2 行用于 2d vector ,3 行用于 3d vector ,我也在代码中使用其他特定的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com