我必须序列化一个对象,该对象包含一个std::vector<unsigned char>
可以包含数千个成员的对象,而该向量大小的序列化不能很好地扩展。
根据文档,Boost 提供了一个包装类数组,用于包装向量以进行优化,但它会生成相同的 xml 输出。在 boost 代码中潜水,我发现了一个名为的类use_array_optimization
,它似乎可以控制优化,但默认情况下会以某种方式停用。我也试图覆盖没有结果的序列化函数。
我想知道如何激活优化,因为 boost 中的文档不清楚。
我必须序列化一个对象,该对象包含一个std::vector<unsigned char>
可以包含数千个成员的对象,而该向量大小的序列化不能很好地扩展。
根据文档,Boost 提供了一个包装类数组,用于包装向量以进行优化,但它会生成相同的 xml 输出。在 boost 代码中潜水,我发现了一个名为的类use_array_optimization
,它似乎可以控制优化,但默认情况下会以某种方式停用。我也试图覆盖没有结果的序列化函数。
我想知道如何激活优化,因为 boost 中的文档不清楚。
数组优化背后的想法是,对于可以通过简单地将它们的表示“转储”到存档中来存档的类型数组,一次“转储”整个数组比“转储”一个又一个元素要快.
我从您的问题中了解到您正在使用 xml 存档。数组优化不适用于这种情况,因为元素的序列化无论如何都意味着转换。
最后,我使用了 BOOST_SERIALIZATION_SPLIT_MEMBER() 宏并编写了两个用于加载和保存的函数。保存函数如下所示:
template<class Archive>
void save(Archive & ar, const unsigned int version) const
{
using boost::serialization::make_nvp;
std::string sdata;
Vector2String(vData, sdata);
ar & boost::serialization::make_nvp("vData", sdata);
}
Vector2String 函数只是简单地获取向量中的数据并将其格式化为 std::string。加载函数使用反转编码的函数。
您有几种方法可以vector
使用 Boost Serialization 将 a 序列化为 XML。根据我在评论中看到的内容,您正在寻找下面的案例 2。
我认为你不能std::vector
在 include 之后改变库的序列化方式boost/serialization/vector.hpp
,但是你可以用你自己的代码和接近案例 2 的东西替换那里的代码。
第一个是使用库给出的默认值,据我所知不会优化任何东西:
#include <boost/serialization/vector.hpp>
...
std::vector<double> vec(4);
std::iota(begin(vec), end(vec), 0);
std::ofstream ofs{"default.xml", boost::archive::no_header};
boost::archive::xml_oarchive xoa{ofs};
xoa<< BOOST_NVP(vec);
输出:
<vec>
<count>4</count>
<item_version>0</item_version>
<item>0.00000000000000000e+00</item>
<item>1.00000000000000000e+00</item>
<item>2.00000000000000000e+00</item>
<item>3.00000000000000000e+00</item>
</vec>
#include <boost/serialization/array_wrapper.hpp> // for make_array
...
std::ofstream ofs{"array.xml"};
boost::archive::xml_oarchive xoa{ofs, boost::archive::no_header};
auto const size = vec.size();
xoa<< BOOST_NVP(size) << boost::serialization::make_nvp("data", boost::serialization::make_array(vec.data(), vec.size()));
输出:
<size>4</size>
<data>
<item>0.00000000000000000e+00</item>
<item>1.00000000000000000e+00</item>
<item>2.00000000000000000e+00</item>
<item>3.00000000000000000e+00</item>
</data>
#include <boost/serialization/binary_object.hpp>
...
std::ofstream ofs{"binary.xml"};
boost::archive::xml_oarchive xoa{ofs, boost::archive::no_header};
auto const size = vec.size();
xoa<< BOOST_NVP(size) << boost::serialization::make_nvp("binary_data", boost::serialization::make_binary_object(vec.data(), vec.size()*sizeof(double)));
<size>4</size>
<binary_data>
AAAAAAAAAAAAAAAAAADwPwAAAAAAAABAAAAAAAAACEA=
</binary_data>
我认为这使得 XML 在技术上不可移植。