作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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/
我正在尝试使用 Boost 序列化/反序列化 Armadillo colvec 对象。 colvec 是具有几个不同大小的列 vector ,例如它可以有 2 行用于 2d vector ,3 行用于
我是一名优秀的程序员,十分优秀!